2010-02-25 4 views
29

정적으로 뭔가를 컴파일하려고 노력하고있어 이러한 모든 종속성이 무엇인지 처리하려고합니다. 나는 .dll 파일이 최종 출력물에 필요한 동적으로 링크 된 종속성을 가지고 있지만 .a 및 .lib 파일은 무엇이며 언제 각각 필요합니까? 같은뿐만 윈도우에있는 lib 디렉토리 반면.lib와 .a 파일의 차이점은 무엇입니까?

답변

28

.a는 컴파일 된 코드이지만 링크되지 않은 코드 보관소입니다. 프로그램의 최종 링크 단계에서 정적으로 링크됩니다. 런타임에서 .DLL을 요구하는 원인이 얇은 자리 :

lib 디렉토리는 운영자와 같은, 또는 마법의 소위 "가져 오기 라이브러리"가 될 수 있습니다.

+0

.a OpenSSL 라이브러리를 사용하여 QT 프레임 워크를 컴파일하고 있지만, QT에서 생성 한 최종 실행 파일에 외부 OpenSSL dll이 필요합니다. .a 라이브러리를 사용하는 경우에 이것이 어떻게 될 수 있는지 알고 싶습니까? – Nantucket

+0

OpenSSL .a의 내용은 어떻게 컴파일 되었습니까? 최종 실행 파일을 어떻게 연결하고 있습니까? – crazyscot

+0

"런타임에 .dll이 필요합니다"에 대한 확신이 없습니다. 프로젝트가 .lib 정적 라이브러리를 사용하는 경우 .dll 종속성이없는 한 .dll이 필요하지 않습니다. – ha9u63ar

4

일반적으로 .A 는 리눅스에서 정적 라이브러리입니다. 물론 그것은 단지 대회 일뿐입니다. 유닉스 시스템에서

19

당신은 .a 파일이 있습니다. 이것들은 객체 파일의 간단한 아카이브 (.o)입니다.

는 Windows에서이 꽤 같은 일이다 .lib 파일,하지만 윈도우 대신 유닉스합니다.

DLL (Windows)과 일부 코드를 연결하려면 DLL을 호출하는 간단한 래퍼가 들어있는 .lib 파일을 링크해야합니다. 유닉스 시스템에서는 전통적으로 그러한 래퍼가 필요 없다 (링커는 즉시 생성 할 수있는 똑똑하다).

+0

이 답변을 주셔서 감사합니다. 어딘가에서 Windows 플래그로 컴파일하려고했습니다. :) –

+0

Windows와 유닉스에서 만든 .a 사이에 차이가 있습니까? – samnaction

5

여기서 언급하지 않은 것이 있습니다. 적어도, .a 파일과 .lib 파일은 실제로는 인 동일한 이진 형식 입니다. mingw 웹 사이트에서 아무 것도 찾을 수 없지만 MS Visual C++의 64 비트 컴파일러 인 cl.exe를 mingw-w64 g ++ 컴파일러를 사용하여 만든 .dll 파일에 링크하려고 할 때 즐겁게 느꼈습니다. 명령 줄

cl /EHsc /Ipath\to\include gmp_test.cpp path\to\lib\libgmp.dll.a 

을 받아 내가이 현재 디렉토리에 해당하는 .dll 파일의 사본을 넣어 결과 .exe 파일은 즉시 제대로 실행. (그것은 경고 중얼했다. "명령 줄 경고 D9024을 : 알 수없는 소스 파일 형식을 '경로 \를 \ lib 디렉토리 \ GMP-6.0.0 \ lib 디렉토리 \ libgmp.dll.a', 오브젝트 파일이 가정")

또한 증거 Linux file 명령이 시도한 각 확장명 (.lib 또는 .a)의 여러 파일에 대해 "현재 ar 아카이브"가보고되었다는 것입니다.

관련 문제