간단한 연결 방법으로 내 문제를 설명하고 싶습니다. 공유 라이브러리 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. 여기에 많은 질문이 있지만 각 질문은 이전 질문에 달려 있다고 생각하며 질문을 여러 가지 질문으로 나눌 필요가 없습니다.
cygwin 예제를 보겠습니다. Cygwin으로 컴파일 된 프로그램은 특정 DLL을 실행해야한다는 것을 이해합니다. dll은 특정 라이선스 (무료 라이선스 중 하나)에 바인딩되어 있으며 프로그램의 호스트 시스템에 있어야합니다. 개발자가 프로그램과 함께 제공하는 것을 잊어 버린 경우 프로그램이 실행되지 않습니다. 또 다른 예는 버전 충돌 DLL (즉, OpenGL)입니다. 모든 시스템마다 기능이 다르므로 특정 DLL의 구현이 다릅니다. 때때로 개발자들은 올바른 라이브러리 버전 => 정적 링크를 사용하기를 원합니다. – scones