lib와 dll의 차이, 생성 및 사용 설명

15463 단어 dll
【목록】
lib dll 소개
동적 라이브러리 생성
동적 라이브러리 호출
정적 라이브러리 생성
정적 라이브러리 호출
 
먼저 정적 라이브러리(정적 링크 라이브러리), 동적 라이브러리(동적 링크 라이브러리)의 개념을 소개하고, 우선 둘 다 코드 공유 방식이다.
정적 라이브러리: 링크 단계에서 연결기는 라이브러리 파일에서 필요한 코드를 얻어 생성된 실행 가능한 파일로 복사한다. 이런 라이브러리는 정적 라이브러리라고 하는데 실행 가능한 파일에 라이브러리 코드의 완전한 복사가 포함된 것이 특징이다.단점은 여러 번 사용하면 여분의 복사본이 많다는 것이다.즉 정적 라이브러리의 명령은 모두 최종적으로 생성된 EXE 파일에 직접 포함됩니다.vs에서 정적 라이브러리를 생성하는 프로젝트를 새로 만듭니다. 컴파일링에 성공하면 하나만 생성됩니다.lib 파일
동적 라이브러리: 동적 링크 라이브러리는 실행 파일이 아닌 여러 프로그램에서 동시에 사용할 수 있는 코드와 데이터를 포함하는 라이브러리입니다.동적 링크는 프로세스가 실행 가능한 코드에 속하지 않는 함수를 호출할 수 있는 방법을 제공합니다.함수의 실행 가능한 코드는 컴파일되고 링크되어 사용되는 프로세스와 별도로 저장된 하나 이상의 함수를 포함하는 DLL에 있습니다.vs에서 동적 라이브러리를 생성하는 프로젝트를 새로 만듭니다. 컴파일에 성공하면 하나가 생성됩니다.lib 파일 및.dll 파일
그렇다면 상술한 정적 라이브러리와 동적 라이브러리 중의lib는 어떤 차이가 있습니까?
정적 라이브러리의lib: 이 LIB는 함수 코드 자체(즉 함수 인덱스 포함, 실현 포함)를 포함하고 컴파일할 때 코드를 프로그램에 직접 추가합니다
동적 라이브러리의lib: 이 LIB는 함수가 있는 DLL 파일과 파일의 함수 위치에 대한 정보 (인덱스) 를 포함하고 있으며, 함수 구현 코드는 실행할 때 프로세스 공간에 불러오는 DLL에서 제공합니다
한 마디로 하면lib는 컴파일할 때 사용되고 dll는 실행할 때 사용됩니다.원본 코드의 컴파일을 완성하려면lib만 필요합니다.동적 링크 프로그램을 실행하려면 dll만 필요합니다.
다음 예는 모두 vs2010에서 테스트한다
동적 라이브러리 생성 및 사용
동적 라이브러리 생성
새 항목 - win32 항목 - 항목 이름 입력 - 확인 - 다음 - 응용 프로그램 유형: dll- 추가 옵션 선택: 내보내기 기호 선택 - 완료
dllmain이 생성된 것을 볼 수 있습니다.cpp 파일, 이것은 dll 프로그램의 입구입니다. 일반 프로젝트의 입구main 함수와 다르기 때문에 이 파일은 수정할 필요가 없습니다.
이 동적 라이브러리에서 우리는 예를 들어 변수, 클래스, 함수, 헤더 파일 dll를 내보냅니다.h는 다음과 같습니다.
 1 //    dll    ,vs      DLL_EXPORT,  ,DLL_API   __declspec(dllexport),    

 2 //        dll ,        ,      DLL_EXPORT,  DLL_API 

 3 //__declspec(dllimport),    

 4 #ifdef DLL_EXPORTS

 5 #define DLL_API __declspec(dllexport)

 6 #else

 7 #define DLL_API __declspec(dllimport)

 8 #endif

 9 

10 //    

11 class DLL_API Cdll {

12 public:

13     Cdll(void);

14     // TODO:         。

15 };

16 

17 //    ,   .cpp     

18 extern DLL_API int ndll;

19 

20 //    , extern "C",                ,      dll   

21 //         

22 extern "C" DLL_API int fndll(void);

dll.cpp 파일은 다음과 같습니다.
 1 #include "dll.h"

 2 

 3 

 4 //            

 5 DLL_API int ndll=6;

 6 

 7 //

 8 DLL_API int fndll(void)

 9 {

10     return 42;

11 }

12 

13 //14 //         ,    dll.h

15 Cdll::Cdll()

16 {

17     return;

18 }

동적 라이브러리 호출
동적 라이브러리를 호출하는 두 가지 방법이 있는데, 하나는 스텔스 링크, 하나는 디스플레이 링크이다.
동적 라이브러리 호출:암시적 링크
스텔스 링크가 필요합니다.h파일, dll파일,lib 파일
(1) 프로젝트의 작업 디렉터리에 dll을 넣기
(2) 항목 속성 --vc++ 디렉터리 - 라이브러리 디렉터리가lib인 경로 설정
(3) lib을 프로젝트 등록 정보 - 링크 - 입력 - 추가 종속 항목에 추가하거나 소스 코드에 #pragma comment(lib, "**.lib")을 직접 추가합니다.
(4) 소스 파일에 추가.h 헤더 파일
그리고 평상시처럼 일반 함수, 클래스, 변수를 호출한다
동적 라이브러리 호출:링크 표시
링크를 표시하려면.dll 파일, 그러나 이런 호출 방식은 dll의 변수나 클래스를 호출할 수 없습니다. (사실 클래스를 호출할 수 있지만 상당히 번거롭습니다. 관심 있는 사람은 참고할 수 있습니다http://blog.csdn.net/jdcb2001/article/details/1394883
WIN32 API 함수인 LoadLibrary, GetProcAddress를 주로 사용하는 호출을 표시합니다. 예를 들면 다음과 같습니다.
 1 typedef int (*dllfun)(void);//    dll        

 2     HINSTANCE hlib = LoadLibrary(".\\dll.dll");

 3     if(!hlib)

 4     {

 5         std::cout<<"load dll error
"; 6 return -1; 7 } 8 dllfun fun = (dllfun)GetProcAddress(hlib,"fndll"); 9 if(!fun) 10 { 11 std::cout<<"load fun error
"; 12 return -1; 13 } 14 fun();

정적 라이브러리 생성 및 사용
정적 라이브러리 생성
새 항목 - win32 항목 - 항목 이름 입력 - 확인 - 다음 - 응용 프로그램 유형: 정적 라이브러리 선택
정적 라이브러리 항목에main 함수도 없고 dll 프로젝트의 dllmain도 없습니다.
항목을 만든 후 추가합니다.h 파일, 상응하는 내보내기 함수, 변수 또는 클래스를 추가하면 다음과 같다.
 1 #ifndef _MYLIB_H_

 2 #define _MYLIB_H_

 3 

 4 void fun(int a);

 5 

 6 extern int k;

 7 

 8 class testclass

 9 {

10 public:

11     testclass();

12     void print();

13 };

14 

15 #endif

.cpp 파일은 다음과 같습니다.
 1 #include "stdafx.h"

 2 #include "lib.h"

 3 #include <iostream>

 4 

 5 void fun(int a)

 6 {

 7     std::cout<<a<<"lib gen
"; 8 } 9 10 int k = 222; 11 12 testclass::testclass() 13 { 14 std::cout<<"123
"; 15 } 16 17 void testclass::print() 18 { 19 std::cout<<"this is testcalss
"; 20 }

프로젝트를 컴파일하면 하나가 생성됩니다.lib 파일
정적 라이브러리 사용
필요h파일,lib 파일
(1) 항목 속성 --vc++ 디렉터리 - 라이브러리 디렉터리가lib인 경로 설정
(2)lib을 프로젝트 속성 - 링크 - 입력 - 추가 의존 항목에 추가하거나 소스 코드에 #pragma comment(lib, "**.lib")을 직접 추가합니다.
(3) 소스 파일에 추가합니다.h 헤더 파일
그런 다음 일반 함수, 클래스, 변수를 다음과 같이 호출합니다.
 1 #include <iostream>

 2 #include "lib.h"

 3 

 4 #pragma comment(lib, "lib.lib")

 5 

 6 int main()

 7 {

 8     fun(4);

 9     std::cout<<k<<std::endl;

10     testclass tc; 

11     tc.print();

12     return 0;

13 }

 
텍스트 링크: http://www.cnblogs.com/TenosDoIt/p/3203137.html

좋은 웹페이지 즐겨찾기