본문 바로가기

Study Memos/Windows Programming

LIB vs DLL (Section 106)

참고> blog.naver.com/tipsware/221359282016

 

1. LIB 파일(Library, *.lib): C 언어 소스 파일(*.c 또는 *.cpp)을 컴파일해서 만든 목적 파일(*.obj)을 효율적으로

   재구성해 놓은 파일
   -> 실행 파일에 포함될 때는 링커(Linker)에 의해 라이브러리에서 실제로 사용되는 함수의 코드만 실행 파일에 포함함.

2. LIB 파일의 경우 라이브러리의 내용이 바뀌면 새로 빌드해야 하는 단점이 있음. 이 불편함음 보완하기 

   위해 Windows 운영체제는 DLL(Dynamic Linking Library) 라는 기술을 제공함
   -> DLL은 프로그램이 실행될 때 연결되서 사용됨

3. DLL은 라이브러리에 문제가 있을 경우 해당 DLL 파일만 새로 만들면 되기 때문에 LIB에 비해 편함. 

   But, DLL은 Windows 운영체제에서만 사용 가능하고 
   DLL 버전 관리를 잘못하기 시작하면 다양하고 헷갈리는 오류에 시달리게 됨. DLL 지옥(DLL Hell) 이라는 말도 존재함. DLL은 잘 사용하면 약, 잘못 사용하면 독.

4. DLL을 사용하는 프로그램에서 DLL 내부에 존재하는 함수를 사용하려면 __declspec(dllexport) 를 DLL 함수 선언에 

   추가해 주어야 함.
   -> 또한 DLL을 사용하는 프로그램은 pragma 전처리기를 사용해서 lib을 포함 시켜주어야 함.

 

   ex) #pragma comment(lib, "mySubProgram.lib")

 

5. 4번 처럼 DLL을 사용할 때 LIB을 참조하는 방식은 LIB파일과 DLL파일의 불일치 등의 버그 소지가 있음. 
   이를 위해 LIB 파일을 안쓰는 방법으로는 DLL 함수를 사용할 시점에 LoadLibrary() 함수로 DLL 파일을 연결하면 됨.

6. DLL 함수의 선언부에서 extern "C" 라는 키워드를 추가해주어야 DLL 함수 이름을 외부에서 제대로 찾을 수 있음.
   왜냐하면 C++ 컴파일러는 함수 이름을 컴파일할 때 바꿔버리기 때문에 extern "C"라는 키워드를 통해 DLL함수를

   C언어 방식으로 컴파일 해주어야 함.

7. 연결된 DLL 파일을 연결 해제할 때는 FreeLibrary() 함수를 사용하면 됨.

8. 연결된 DLL 파일에서 특정 함수를 찾고 싶을 땐 GetProcAddress() 함수를 사용하면 됨.

9. 즉, __declspec(dllexport), extern "C", LoadLibrary(), FreeLibrary(), GetProcAddress() 를 사용하면 프로그램 

   실행 시에 자신이 원하는 시점에 DLL 파일을 직접 연결해서 사용할 수 있음.

10. LIB 파일 없이 DLL 파일을 쓰자
   -> LIB 파일 없이 LoadLibrary() 함수를 사용하면 프로그램의 종료 없이 DLL 파일을 갈아끼울 수 있다.
       (물론, 프로그램이 LoadLibrary() 함수와 FreeLibrary() 함수를 프로그램 실행 중에 호출할 수 있는 방안이나

       백도어는 프로그래머가 알아서 만들어두었어야 한다.)
   
   -> 이 방식은 서버 프로그램을 개발할 때 꽤나 중요할 것 같다. 계속 작동해야 하는 서비스의 중단 없이 특정 기능을 업그레이드 할 수 있기 때문이다.




반응형