.lib .dll 구별 소개, 사용 (dll의 두 가지 도입 방식)

9492 단어
.lib .dll 파일은 모두 프로그램이 직접 인용할 수 있는 파일로 전자는 이른바 라이브러리 파일이고 후자는 동적 링크 라이브러리(Dynamic Link Library)도 라이브러리 파일이다.그러나pdb는 기호표 파일로 이해할 수 있다.DLL(Dynamic Link Library) 파일은 Dynamic Link Library) 파일이며 소프트웨어 파일 유형이라고도 합니다.Windows에서 많은 응용 프로그램은 완전한 실행 가능한 파일이 아니다. 그들은 상대적으로 독립된 동적 링크 라이브러리, 즉 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을 사용하려면 다음 두 파일을 주의해야 합니다.
  • h 헤더 파일로lib에서 출력을 설명하는 클래스나 기호의 원형이나 데이터 구조를 포함한다.프로그램에서lib을 호출할 때 이 파일을 프로그램의 원본 파일에 포함해야 합니다.
  • LIB 파일, 이lib에는 함수의 실현 코드가 있습니다. 이것은lib의 코드를 목표 모듈(.exe 또는.dll) 파일에 추가하기 때문에 링크가 끝난 후에lib 파일은 쓸모가 없습니다.이러한lib 파일은 사실상 임의의obj 파일의 집합이다.obj 파일은 cpp 파일을 컴파일하여 생성한 것이고, cpp 파일이 여러 개 있으면 여러 개의obj 파일을 컴파일하여 생성한lib 파일에도 여러 개의obj가 포함되어 있다.

  • Dynamic Link Library(Dynamic Link Library)의 가져오기 라이브러리(Import Library)에서는 다음 세 가지 파일을 사용합니다.
  • h 헤더 파일은 dll에서 출력된 클래스나 기호의 원형이나 데이터 구조를 설명하는 것을 포함한다.h 파일.프로그램이 dll를 호출할 때, 이 파일을 프로그램의 원본 파일에 포함해야 합니다.
  • LIB 파일은 dll이 컴파일하고 링크에 성공한 후에 생성된 파일로 다른 프로그램이 dll을 호출할 때 이 파일을 프로그램에 도입해야 하며 그렇지 않으면 오류가 발생하는 것을 작용한다.lib 파일을 사용하지 않거나 lib 파일이 없는 경우 WIN32 API 함수인 LoadLibrary, GetProcAddress를 사용하여 로드할 수 있습니다.
  • dll 파일, 진정한 실행 가능한 파일, 개발에 성공한 응용 프로그램이 발표될 때 있으면 됩니다.exe 파일 및.dll 파일, 필요 없습니다.lib 파일 및.h 헤더 파일.

  • 이런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 환경 변수에 나열된 일련의 디렉토리입니다.

    좋은 웹페이지 즐겨찾기