.lib .dll 구별 소개, 사용 (dll의 두 가지 도입 방식)
lib와 dll의 차이점
(1)lib은 컴파일할 때 사용되고 dll는 실행할 때 사용됩니다.원본 코드의 컴파일을 완성하려면lib만 필요합니다.동적 링크 프로그램을 실행하려면 dll만 필요합니다.(2) 만약에 dll 파일이 있다면lib는 일반적으로 색인 정보로 dll에서 함수의 입구와 위치를 기록하고 dll에서 함수의 구체적인 내용을 기록한다.만약lib 파일만 있다면, 이lib 파일은 정적 컴파일로 인덱스와 실현이 모두 포함되어 있습니다.정적 컴파일된lib 파일을 사용하면 프로그램을 실행할 때 동적 라이브러리를 다시 걸 필요가 없습니다. 응용 프로그램이 비교적 크고 동적 라이브러리의 유연성을 잃기 때문에 새로운 버전을 발표할 때 새로운 응용 프로그램을 발표해야 합니다.(3) 동적 링크의 경우 두 개의 파일이 있습니다. 하나는 LIB 파일이고 하나는 DLL 파일입니다.LIB는 DLL에서 내보낸 함수 이름과 위치를 포함하고 DLL은 실제 함수와 데이터를 포함하며 응용 프로그램은 LIB 파일을 사용하여 DLL 파일에 연결합니다.응용 프로그램의 실행 파일에는 호출된 함수 코드가 아닌 DLL에 있는 해당 함수 코드의 주소가 저장되어 메모리 자원을 절약할 수 있습니다.lib 파일을 사용하지 않거나 lib 파일이 없는 경우 WIN32 API 함수인 LoadLibrary, GetProcAddress를 사용하여 로드할 수 있습니다.
필요한 파일
정적 링크 라이브러리(Static Link Library)에서 lib을 사용하려면 다음 두 파일을 주의해야 합니다.
Dynamic Link Library(Dynamic Link Library)의 가져오기 라이브러리(Import Library)에서는 다음 세 가지 파일을 사용합니다.
이런lib는 dll와 협조하여 사용하는 것이다. 안에 코드가 없고 코드는 dll에 있다. 이런lib는 정적 호출 dll에 사용되기 때문에 작용하는 것도 링크 작용이다. 링크가 완성되면lib도 소용없다.dll를 동적 호출하면lib 파일을 사용할 수 없습니다.대상 모듈 (exe 또는 dll) 파일이 생성되면lib 파일을 사용할 수 없습니다.
로드 파일 가져오기
lib/ 헤더 파일 불러오기 (추가하지 않으면 연결 오류: 해석할 수 없는 외부 기호)
정적 링크는lib 파일만 필요합니다. 물론 헤더 파일도 필요합니다.이 방식은lib 파일의 두 부분으로 되어 있으며, 파일 접두사를rar로 바꾸어 압축을 풀 수 있습니다.첫 번째 부분은 첫 번째 방식 중의 키와 두 번째 부분은.obj 파일은 obj 폴더에 저장되어 있습니다. 그는 dll에 있는 기계 코드와 상당히 비슷합니다. 단지 이 기계 코드는 연결할 때 프로그램에 넣는 것이지 프로그램이 실행될 때 가져오는 것이 아닙니다.만약에 이때도 원본 코드가 있고 IED가 원본 코드를 디버깅할 수 있기를 희망한다면 이것은 매우 쉽다. 만약lib 파일이 생성될 때 모드가 NDEBUG(아닌 것 같아도 될 것 같아)이면obj 폴더 아래에 xx가 있기 때문이다.pdb 이 pdb 파일의 물건은 IED가 프로그램의 pdb에 넣기 때문에 원본 코드의 위치를 직접 지정하여 사용하면 됩니다.1 첫 번째 단계: 프로젝트-> 속성->C/C++-> 일반-> 디렉터리 추가(.h 파일 경로 탐색) 포함 파일 추가 두 번째 단계: 프로젝트-> 속성->C/C++-> 링크기-> 입력-> 추가 의존항(lib 이름에 쓰기)에 사용된lib 추가(이 단계는 코드에 호출된 #pragma comment(lib, "**.lib")를 표시할 수도 있음)프로젝트->속성->C/C++->링크기->일반->추가 라이브러리 디렉터리에 라이브러리 파일 경로 추가 4 세 번째 단계: cpp 파일을 사용하기 전에 #include(파일의 경로 주의)를 추가하고 프로젝트를 만들 때마다 다시 설정해야 하며 debug와release는 모두 설정해야 하며 win32와 win64 플랫폼을 주의해야 한다.
dll 불러오기 (추가하지 않으면 컴파일 링크가 틀리지 않습니다. 실행 오류: ***.dll를 찾을 수 없습니다)
이런 방식의 기본 원리는lib 파일에서 프로그램 (함수) 의 입구나 주소를 확대하는 것이고, 그의 진정한 기계 코드는 dll 파일에서 IDE가 연결될 때이다.lib 파일 (프로그램 주소) 은 원본 코드에 연결되어 있으며, 프로그램이 실행될 때 해당 위치 (환경 변수 path, 현재 디렉터리 등) 에서 dll 파일을 찾아 기계 코드를 실행합니다.그래서 이런 인용 방식이 일반적으로 필요한 파일은 일반적으로 세 가지가 있다.h,.lib,.dll, 생성된 원본 프로그램도 비교적 작을 것이다. 왜냐하면 그는 함수 주소만 저장했기 때문이다. 그러나 이런 방식은 항상 xxx를 찾을 수 없기 때문이다.dll 이런 문제.만약 이때 dll의 원본 코드가 있고 IED가 원본 코드를 디버깅할 수 있기를 희망한다면 필요합니다.pdb 파일입니다. pdb 파일에 dll의 기호표가 저장되어 있습니다. 이른바 기호표는 기계 코드(이곳은 dll에 있는)에 삽입된 키와 원본 코드 파일의 맵으로 이해할 수 있습니다. 이렇게 하면 원본 코드가 저장된 경로를 지정하면 IDE는 자동으로 원본 코드를 찾을 수 있습니다.주의해야 할 것은 pdb 파일과 dll 파일은 조립된 것이다. 즉, dll 파일이 바뀌면 (예를 들어 재생성) pdb 파일은 반드시 상응하는 변화를 해야 한다는 것이다.pdb 파일도 비교적 크고 프로그램이 실행될 때도 맵을 완성해야 하기 때문에 비교적 느리다. 이것도release 버전과 debug의 차이이다.
dll 파일의 사용에 대해 프로젝트 debug 파일로 dll 파일을 복사하거나 시스템 환경 변수에 dll 파일의 경로 (...\bin) 를 추가합니다.
(1) 추가 종속성 구성
정적 라이브러리와 같은 사용을 vs에서 직접 설정합니다.(사실 본질은 스텔스 링크이고 설정 방식만 다르다)
(2) 암시적 링크
첫 번째 방법은 프로젝트->link->Object/LibraryModule를 통해 가입합니다.lib 파일(또는 소스 코드에 명령 #pragma comment(lib, "Lib.lib")을 추가하고dll 파일을 프로젝트가 있는 디렉터리에 넣고 대응하는 것을 추가합니다.h 헤더 파일.
1 #include "stdafx.h"
2 #include "DLLSample.h"
3
4 #pragma comment(lib, "DLLSample.lib") //
5
6 int main()
7 {
8 TestDLL(123); //dll , DllSample.h
9 return(1);
10 }
(3) 명시적 링크
또 다른 방법은 윈도우즈의api LoadLibrary를 호출해서 dll을 불러오고, 헤더 파일에 따라 GetProcAddress를 호출해서 dll의 함수를 불러오고, 마지막으로FreeLibrary를 사용해서 방출하는 것입니다. 이런 방식은 분명히 디버깅할 수 없습니다.함수 포인터와 WIN32 API 함수 LoadLibrary, GetProcAddress를 불러와야 합니다. 이런 불러오는 방법은 필요 없습니다.lib 파일 및.h 헤더 파일, 단지.dll 파일은 프로젝트 디렉토리에.dll 파일을 배치할 수 있습니다.
1 #include
2 #include //
3 typedef void (*DLLFunc)(int);
4 int main()
5 {
6 DLLFunc dllFunc;
7 HINSTANCE hInstLibrary = LoadLibrary("DLLSample.dll");
8
9 if (hInstLibrary == NULL)
10 {
11 FreeLibrary(hInstLibrary);
12 }
13 dllFunc = (DLLFunc)GetProcAddress(hInstLibrary, "TestDLL");
14 if (dllFunc == NULL)
15 {
16 FreeLibrary(hInstLibrary);
17 }
18 dllFunc(123);
19 std::cin.get();
20 FreeLibrary(hInstLibrary);
21 return(1);
22 }
LoadLibrary 함수는 하나의 이름을 매개 변수로 삼아 DLL의 실례를 얻습니다. (HINSTANCE 형식은 실례의 핸들입니다.) 보통 이 함수를 호출한 후에 함수 반환이 성공했는지 확인하고, 성공하지 못하면 NULL (핸들이 잘못되었습니다.) 이 때 함수 FreeLibrary를 호출해서 DLL이 얻은 메모리를 방출합니다.GetProcAddress 함수는 DLL의 핸들과 함수의 이름을 매개 변수로 하고 해당하는 함수 바늘을 되돌려주며 강회전을 사용해야 한다.함수 포인터가 NULL인지 여부를 판단하고, 만약 그렇다면 함수 FreeLibrary를 호출하여 DLL에서 얻은 메모리를 방출합니다.이후 함수 바늘을 사용하여 실제 함수를 호출할 수 있다.마지막으로 FreeLibrary 함수를 사용하여 메모리를 방출하는 것을 기억해야 한다.
참고 애플리케이션에서 DLL 파일을 어떻게 찾습니까?
LoadLibrary 명시적 링크를 사용하면 함수의 매개 변수에서 DLL 파일의 전체 경로를 지정할 수 있습니다.경로를 지정하지 않거나 암시적 링크가 있는 경우 Windows는 다음 검색 순서에 따라 DLL을 찾습니다. (1) EXE 파일이 포함된 디렉토리(2) 엔지니어링 디렉토리(3) Windows 시스템 디렉토리(4) Windows 디렉토리(5) Path 환경 변수에 나열된 일련의 디렉토리입니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.