정적 라이브러리, 정적으로 연결된 동적 라이브러리 및 동적으로 연결된 동적 라이브러리의 .lib 파일에는 무엇이 있습니까?


82

정적 라이브러리, 정적으로 연결된 동적 라이브러리 및 동적으로 연결된 동적 라이브러리의 .lib 파일에는 무엇이 있습니까?

동적으로 연결된 동적 라이브러리에 .lib 파일이 필요하지 않고 정적 연결에서 .lib 파일은 모든 메서드가 포함 된 .obj 파일 일뿐입니다. 그 맞습니까?


4
질문은 MS Windows 플랫폼에 관한 것임을 알 수 있습니다.
cubuspl42

답변:


144

정적 라이브러리의 경우 .lib 파일에는 라이브러리에 대한 모든 코드와 데이터가 포함됩니다. 그런 다음 링커는 필요한 비트를 식별하고 최종 실행 파일에 넣습니다.

동적 라이브러리의 경우 .lib 파일에는 라이브러리에서 내 보낸 함수 및 데이터 요소 목록과 이들이 가져온 DLL에 대한 정보가 포함됩니다. 링커가 최종 실행 파일을 빌드 할 때 라이브러리의 함수 또는 데이터 요소가 사용되면 링커는 DLL에 대한 참조를 추가하고 (Windows에서 자동으로로드 됨) 실행 파일의 가져 오기 테이블에 항목을 추가합니다. 함수 호출이 해당 DLL로 리디렉션됩니다.

동적 라이브러리를 사용하기 위해 .lib 파일이 필요하지는 않지만 파일이 없으면 DLL의 함수를 코드에서 일반 함수로 처리 할 수 ​​없습니다. 대신 수동으로 호출 LoadLibrary하여 DLL을로드하고 ( FreeLibrary완료시) GetProcAddressDLL에서 함수 또는 데이터 항목의 주소를 가져와야합니다. 그런 다음 반환 된 주소를 사용하려면 적절한 함수 포인터로 캐스팅해야합니다.


4
긴 검색, IMO 후 lib & dll을 사용하는 이유에 대한 최상의 답변을 얻었습니다. 감사합니다
Jeet

@Anthony Williams가 "동적 라이브러리의 경우 .lib 파일에는 라이브러리에서 내 보낸 함수 및 데이터 요소 목록과 이들이 가져온 DLL에 대한 정보가 포함됩니다."라고 말했을 때 "import"라는 .lib 파일이 있습니다. lib 파일 ( "static library")과 다른 라이브러리 "
starriet

예, 가져 오기 라이브러리입니다
Anthony Williams

13

Hans의 다음 답변 도 여기에서 유용하다는 것을 알았습니다 . 두 가지 유형의 lib 파일이있을 수 있다는 공기를 맑게합니다.

LIB 파일은 프로그램을 빌드하는 데 사용되며 빌드 머신에만 존재하며 제공하지 않습니다. 두 종류가 있습니다. 정적 링크 라이브러리는 단일 파일로 수집 된 .obj 파일 모음입니다. 링커는 외부 식별자를 확인해야 할 때 파일에서 코드 청크를 선택합니다.

그러나 DLL과 더 관련이있는 LIB 파일은 가져 오기 라이브러리 일 수도 있습니다. 그런 다음 DLL 이름과 DLL에서 내 보낸 모든 함수 목록을 포함하는 간단한 작은 파일입니다. DLL을 사용하는 프로그램을 빌드 할 때 링커에 제공해야 외부 식별자가 실제로 DLL에서 내 보낸 함수임을 알 수 있습니다. 링커는 가져 오기 라이브러리를 사용하여 EXE에 대한 가져 오기 테이블에 항목을 추가합니다. 그런 다음 런타임에 Windows에서 프로그램을 실행하기 위해로드해야하는 DLL을 파악하는 데 사용됩니다.


8

정적 라이브러리에서 lib 파일에는 라이브러리가 제공하는 함수에 대한 실제 개체 코드가 포함되어 있습니다. 공유 버전 (정적으로 링크 된 동적 라이브러리라고 함)에는 런타임에 동적 링크를 설정하기에 충분한 코드가 있습니다.

"동적으로 연결된 동적 라이브러리"(프로그래밍 방식으로로드 됨)에 대해 잘 모르겠습니다. 이 경우 .lib와 연결합니까?

편집하다:

조금 늦었지만 아니요, .lib를 연결하지 않습니다. 글쎄, 당신은 그 안에 libraryloaderex와 함께 lib에 링크합니다. 그러나 사용중인 실제 라이브러리의 경우 C 함수 포인터를 통해 고유 한 바인딩을 제공하고 loadlibrary가이를 채 웁니다.

요약은 다음과 같습니다.

연결 ǁ 정적 | DLL | LoadLibrary
========= ǁ =============== | ===================== | = ==================
API 코드 ǁ 귀하의 com- | DLL에서 | DLL에서
생활 ǁ 쌓인 프로그램 | |
--------- ǁ --------------- | ---------------------- |- ------------------
기능 ǁ 직접, 5 월 | 테이블을 통한 간접 | 귀하를 통해 간접
전화 ǁ 제거 | 자동으로 채워짐 | 자신의 기능 ptrs
--------- ǁ --------------- | ---------------------- |- ------------------
부담 ǁ 컴파일러 | 컴파일러 / OS | 당신 / OS

정적으로 연결된 라이브러리 란 .lib 파일을 사용하고 컴파일 타임에 .dll을 연결하는 것을 의미합니다. 동적 연결은 Win32 API의 libraryloaderex () 함수를 사용하여 런타임에 .dll을 연결하는 것입니다.
Sulla

6

링커는 lib 파일을 읽고 실행 중에 dll 파일을 사용합니다. lib 파일은 실행 중에 본질적으로 쓸모가 없으며 링커는 dll 파일 을 읽을 수 없습니다 (여기서는 관련없는 방식 제외).

정적 및 동적 링크를위한 lib 파일 사용의 차이점은 혼란 스러울 수 있지만 약간의 역사를 이해하면 매우 명확 해집니다.

원래는 정적 라이브러리 만있었습니다. 정적 라이브러리의 경우 .lib 파일에는 obj 파일이 포함됩니다. 각 obj 파일은 단 하나의 컴파일러 소스 코드 입력 파일의 출력입니다. lib 파일은 디렉토리에 obj 파일을 넣는 것과 같이 관련 obj 파일의 모음입니다. 본질적으로 lib 파일은 obj 파일의 라이브러리입니다. 정적 링크의 경우 실행 파일이 사용하는 모든 obj 파일이 하나의 파일로 결합됩니다. 실행 파일이 사용하는 다른 코드와 별도의 파일에있는 동적 링크와 비교하십시오.

동적 연결을 구현하기 위해 Microsoft는 obj 파일의 위치 대신 dll 파일을 참조하도록 lib 파일 사용을 수정했습니다. 그 외에 정적 링크에 대한 라이브러리에있는 모든 정보는 동적 링크에 대한 정보와 동일합니다. 동적 링크에 대한 lib 파일이 dll 파일을 지정한다는 점을 제외하고는 정보가 모두 동일합니다.


1

dll에는 exe (데이터, 가져 오기, 내보내기, 읽기 / 쓰기 / 실행 가능한 섹션이있을 수 있음)와 같은 "사물"이 있지만 차이점은 exe 파일은 진입 점 (기능) 만 내보내고 dll의 내보내기는 내보내는 것입니다. / 많은 기능.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.