.dll과 .lib의 차이
dll은 동적 공유 라이브러리이고, lib는 dll에 저장된 함수와 데이터에 대한 정보를 담고 있는 파일이다.
(빌드할때 필요함)
.dll (Dynamic Link Library)
윈도우 운영체제에서 동작하는 동적 공유 라이브러리.
재사용 가능한 코드, 데이터, 리소스를 담고 있는 컴파일된 파일로, 실행 시점에 로딩되고, 여러 프로세스에서 공유하여 사용할 수 있다.
1. 함수를 실행파일에 포함시켜 배포하는 것이 아니라, 별도의 dll 파일로 배포
2. 어플리케이션이 실행 중에 dll에 포함된 함수가 필요하면, dll을 로드하고 해당 함수를 호출함
라이브러리란
미리 만들어놓은 함수, 클래스, 자료형, 데이터 등을 모아놓은 것으로, 여러 프로그램에서 재사용될 수 있다.
라이브러리가 생긴 이유
- 코드의 재사용 및 부품화 실현 : 자주 사용하는 함수들은, 한번 만들어 놓고 다시 사용(라이브러리가 소프트웨어 개발의 부품 같은 역할을 함)
- 기술 유출 방지 : 소스를 제공하지 않음으로서 중요 기술 유출 방지
- 개발 시간 단축 : 새로 개발하지 않고 라이브러리의 함수들을 가져다 씀으로서 개발 기간 단축 가능, 새로 개발하는 코드 양이 적어지므로 디버깅도 용이해짐
라이브러리의 종류
- 정적 라이브러리 (Static library) : 빌드 타임에 정적 링킹을 위해 필요한 라이브러리. 프로그램 빌드 시, 링커가 필요한 함수를 정적 라이브러리에서 찾은 후 복사하여 실행파일에 포함시킨다.
- 동적 라이브러리 (Dynamic library) : 런타임에 로딩되는 라이브러리. 프로그램 실행 중(런타임)에 해당 함수가 필요할 때 로딩되는 라이브러리이다. 윈도우에서는 주로 DLL 확장자를 가지며, 리눅스에서는 주로 SO 확장자를 가진다.
- 공유 라이브러리(Shared library) : 여러 어플리케이션이나 프로세스에서 공유되어 사용될 목적으로 만들어진 라이브러리. 예를 들어, 3개의 프로그램에서 A라는 공유 라이브러리를 사용한다고 하면, A는 메모리에 한번만 로드되고 각 프로그램은 로드된 A를 같이 사용한다.
즉, DLL이란 동적 라이브러리와 공유 라이브러리의 특징을 지닌 라이브러리이다.
DLL 구조
실행파일 포맷과 유사하다. 주요 구성요소는 아래와 같다.
- Export table : 다른 프로그램에서 접근 가능한 함수와 데이터의 리스트를 담고 있는 테이블. DLL의 public interface이다.
- Import table : DLL이 다른 라이브러리에서 사용하는 함수와 데이터의 리스트를 담고 있는 테이블. DLL의 private interface이다.
- Code & Data 섹션 : DLL 안에 있는 함수의 구현체와, 그 함수에서 사용되는 데이터이다.
- 리소스 : DLL에는 여러 프로그램에서 공유할 수 있는 아이콘, 비트맵, 문자열 테이블과 같은 리소스도 포함될 수 있다.
프로그램이 DLL을 로드할 때 먼저 import 테이블을 읽어 DLL이 다른 라이브러리에서 필요로 하는 기능과 데이터를 결정한다. 그런 다음 필요한 라이브러리를 로드한다. import 테이블에서 필요로하는 모든 라이브러리가 로딩되고 나면, 프로그램은 export 테이블을 통해 DLL의 기능과 데이터에 액세스할 수 있다.
전반적으로 DLL의 구조는 여러 프로그램이 동일한 코드와 리소스를 공유할 수 있도록 설계되어 성능이 향상되고 메모리 사용량이 감소할 수 있다.
컴파일러가 DLL에 영향을 미치는가?
컴파일러 선택은 특히 DLL이 C++ API를 노출하는 경우 DLL에 영향을 미칠 수 있다. 컴파일러마다 C++ 기호에 대한 이름 맹글링 규칙이 약간 다를 수 있기 때문에 DLL과 이를 사용하는 응용 프로그램 간에 호환성 문제가 발생할 수 있다.
예를 들어 DLL이 특정 버전의 MSVC 컴파일러로 컴파일된 경우 해당 DLL을 사용하는 응용 프로그램도 동일한 버전의 MSVC 컴파일러로 컴파일해야 호환성 문제를 방지할 수 있다.
그러나 DLL이 일반적으로 동적 연결에 사용되는 C API를 노출하는 경우 컴파일러 선택이 덜 중요하다. C API에는 일반적으로 DLL을 빌드하는 데 사용되는 컴파일러와 독립적인 고정 호출 규칙이 있기 때문이다.
Name mangling(이름 맹글링)이란?
소스 코드에 선언된 함수 또는 변수의 이름을 컴파일 단계에서 컴파일러가 일정한 규칙을 가지고 변형하는 것
Name mangling을 사용하는 이유
- 객체 지향 언어에서 오버로딩(Overloading) 하는 동일한 이름의 함수를 구별하여 호출하기 위함
- 다른 Namespace에 있는 동일한 이름의 함수와 변수를 에러 없이 구별하여 호출하기 위함
.lib (Library)
DLL에 저장된 함수와 데이터에 대한 정보를 담고 있는 파일.
빌드 타임에 링커가 어플리케이션을 링킹하는데 lib 안의 정보들을 사용한다.
참고
https://sens.tistory.com/33
https://atmkofw.tistory.com/26
https://en.wikipedia.org/wiki/Library_(computing)
https://namu.wiki/w/DLL
https://en.wikipedia.org/wiki/Dynamic-link_library
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=v_lovepooh_v&logNo=220377595136
Chat GPT 답변
What's the difference of .dll and .lib?
.dll and .lib are file extensions commonly used in Windows-based systems.
A .dll (Dynamic Link Library) file is a type of library file that contains code and data that can be used by multiple applications at the same time. DLLs are used to implement reusable functionality and reduce the size of executable files by sharing common code. When an application requires a function that is implemented in a DLL, the application loads the DLL and calls the function.
A .lib (Library) file is a file that contains information about functions and data stored in a DLL. The information stored in a .lib file is used by the linker to link the application with the DLL at build time. The .lib file contains information about the functions and data exported by the DLL, as well as information about any dependencies the DLL may have.
In summary, .dll files contain the actual implementation of reusable functionality, while .lib files provide information about the functions and data exported by the .dll file, allowing applications to link to the .dll at build time.
What's the difference of shared library and dynamic library?
The terms "shared library" and "dynamic library" are sometimes used interchangeably, but they do have different meanings.
A shared library is a library that is designed to be shared by multiple applications or processes. It is a compiled file that contains code and data that can be loaded and executed by more than one program at the same time. This is achieved through a mechanism called "linking," which is the process of combining one or more object files and libraries into a single executable file. When a program is linked to a shared library, it only includes a reference to the library, not the actual code. This makes the program smaller in size and allows multiple programs to share the same code, which can result in improved performance and reduced memory usage.
A dynamic library is a type of shared library that is loaded into memory at runtime, rather than at compile time. This means that the library code is not included in the executable file, but is loaded from a separate file when the program is run. This allows the program to load and unload the library as needed, which can reduce memory usage and improve performance. Dynamic libraries can also be updated or replaced without the need to recompile the entire program, which can simplify the software development process.
In summary, shared libraries are libraries that can be shared by multiple applications, while dynamic libraries are a type of shared library that is loaded into memory at runtime, rather than at compile time. Dynamic libraries can offer some advantages over shared libraries, such as improved performance and flexibility.
What are the compiler effects on dlls?
The choice of compiler can have an effect on the DLL, especially if the DLL exposes a C++ API. This is because different compilers can have slightly different name mangling conventions for C++ symbols, which can lead to compatibility issues between the DLL and the application using it.
For example, if a DLL is compiled with a particular version of the MSVC compiler, an application that uses that DLL must also be compiled with the same version of the MSVC compiler in order to avoid compatibility issues.
However, if a DLL exposes a C API, which is typically used for dynamic linking, the choice of compiler is less important. This is because C APIs typically have a fixed calling convention that is independent of the compiler used to build the DLL.