2013-04-06 1 views
22

간단한 연결 방법으로 내 문제를 설명하고 싶습니다. 공유 라이브러리 libz.dll (D : /libs/z/shared/libz.dll) 또는 정적 라이브러리 libz.a (D :/libs/z/static/libz)로 컴파일 될 수있는 라이브러리 z이 있다고 가정합니다. .에이).MinGW와의 정적 및 동적/공유 연결

gcc -o main.exe main.o -LD:/libs/z/static -lz 

this documentation에 따르면, GCC는 회원 객체입니다

아카이브 파일입니다 libz.a를 검색 할 :

하자 그때 내가 이렇게 반대 링크 할 파일

또한 다음과 같은 작업을 수행 할 수

:

0123을

위의 문서에서 -l 플래그가 lib<name>.so을 검색한다는 것을 언급하지 않았습니다.

libz.a와 libz.dll이 같은 디렉토리에 있으면 어떻게됩니까? 라이브러리가 프로그램과 어떻게 링크됩니까? -l이 공유 라이브러리와 정적 라이브러리를 모두 검색하는 경우 플래그 -Wl,-Bstatic-Wl,-Bdynamic이 필요한 이유는 무엇입니까?

왜 일부 개발자는 공유 라이브러리 배포를 컴파일하면 동일한 모듈에 대해 .dll 파일을 .a 파일로 제공합니까?

예를 들어, Qt는 .dll 파일을 bin 디렉토리에서 lib 디렉토리의 .a 파일과 함께 제공합니다. 동일한 라이브러리입니까? 그렇지만 공유 라이브러리와 정적 라이브러리와 같이 구축되어 있습니까? 또는 .a 파일은 실제 라이브러리 구현이있는 공유 라이브러리와 연결을 제공하는 일종의 더미 라이브러리입니다.

또 다른 예는 Windows의 OpenGL 라이브러리입니다. 모든 컴파일러가 MingW에서 libopengl32.a와 같은 정적 OpenGL 라이브러리를 제공해야하는 이유는 무엇입니까?

확장명이 .dll.a 및 .la 인 파일은 무엇입니까?

P. 여기에 많은 질문이 있지만 각 질문은 이전 질문에 달려 있다고 생각하며 질문을 여러 가지 질문으로 나눌 필요가 없습니다.

+0

cygwin 예제를 보겠습니다. Cygwin으로 컴파일 된 프로그램은 특정 DLL을 실행해야한다는 것을 이해합니다. dll은 특정 라이선스 (무료 라이선스 중 하나)에 바인딩되어 있으며 프로그램의 호스트 시스템에 있어야합니다. 개발자가 프로그램과 함께 제공하는 것을 잊어 버린 경우 프로그램이 실행되지 않습니다. 또 다른 예는 버전 충돌 DLL (즉, OpenGL)입니다. 모든 시스템마다 기능이 다르므로 특정 DLL의 구현이 다릅니다. 때때로 개발자들은 올바른 라이브러리 버전 => 정적 링크를 사용하기를 원합니다. – scones

답변

23

ld and WIN32 (cygwin/mingw)을 참조하십시오. 특히 Windows의 LD 포트에서 -l 플래그의 동작에 대한 자세한 내용은 섹션에 직접 연결을 참조하십시오. 추출 :

예를 들어

, LD는 그것의 검색 경로의 첫 번째 디렉토리에서 찾을 시도합니다 -lxxx 인수로 호출 될 때,

libxxx.dll.a 
xxx.dll.a 
libxxx.a 
cygxxx.dll (*) 
libxxx.dll 
xxx.dll 

의 다음 디렉토리로 이동하기 전에 검색 경로

는 (*) 사실,이 cygxxx.dll이 아니라 사실 <prefix>가 LD 옵션 -dll-search-prefix=<prefix>에 의해 설정된다 <prefix>xxx.dll이다. cygwin의 경우 표준 gcc 사양 파일에 -dll-search-prefix=cyg이 포함되어 있으므로 실제로는 cygxxx.dll을 검색합니다.

참고 : 당신이 이제까지는 MinGW와 부스트를 구축 한 경우, 당신은 아마 부스트 라이브러리의 이름은 정확히 위의 링크에 설명 된 패턴을 따르는 것을 기억합니다.

이전에는 MinGW에서 *.dll으로 직접 연결하는 데 문제가 있었기 때문에 *.dll의 내 보낸 심볼이 포함 된 정적 라이브러리 을 만들고 대신 연결하는 것이 좋습니다. 이 MinGW wiki 페이지에 대한 링크가 이제 죽었으므로 지금은 *.dll과 직접 링크하는 것이 좋을 것이라고 가정합니다. 또한, 최신 MinGW-w64 배포판을 사용하여 여러 번 직접 해본 결과 문제가 없었습니다.

gcc object1.o object2.o -lMyLib2 -Wl,-Bstatic -lMyLib1 -Wl,-Bdynamic -o output 

위의 조각 보장 : 가끔 이름이 같은 동적 라이브러리는 또한 검색 경로에 존재 예를 들어, 정적 링크를 강제로 원하기 때문에

당신은 링크 플래그 -Wl,-Bstatic-Wl,-Bdynamic 필요 -l 플래그의 기본 연결 우선 순위가 MyLib1으로 다시 지정됩니다. 즉, MyLib1.dll이 검색 경로에 있어도 LD는 libMyLib1.a을 선택합니다. MyLib2에 대해 LD는 다시 동적 버전을 선호합니다.

참고 :MyLib2MyLib1에 따라 달라집니다 경우, MyLib1 동적으로도 연결되어 관계없이 -Wl,-Bstatic의 (즉, 그것은이 경우에는 무시됩니다). 이것을 막으려면 MyLib2도 정적으로 링크해야합니다.