Windows 정적 라이브러리를 생성할 때 링커 경로에 포함되어야 하는 .lib 파일을 생성하기만 하면 됩니다.
Windows 공유 라이브러리를 생성할 때 .dll 외에도 .lib 파일도 생성합니다. 이 lib 파일에는 라이브러리에 의해 노출된 API의 서명이 포함되어 있습니다.
이 라이브러리를 사용하는 방법에는 두 가지가 있습니다.
- 프로젝트에서 직접 라이브러리 API를 참조하고 링커 속성에서 .lib 파일에 대한 경로를 추가할 수 있습니다. 어떤 사람들은 그것을 정적 링크 동적 라이브러리라고 부릅니다.
- 또는 런타임에 명시적으로 동적 라이브러리를 로드할 수도 있습니다. 이 경우 링커에 대한 lib 파일 경로를 지정할 필요가 없습니다. 이를 동적으로 링크된 동적 라이브러리라고 합니다.
내 질문은 Linux의 공유 라이브러리와 비슷한 것이 있습니까? 아니면 정적 라이브러리(.a)와 공유 라이브러리(.so)만 사용합니까?
gcc -l 옵션을 사용하여 Linux에 정적 라이브러리를 포함하는 방법을 알고 있습니다. 동적 라이브러리(.so)를 포함하기 위해 동일한 옵션을 사용할 수 있습니까?
답변1
나는 "정적으로 링크된 동적 라이브러리"가 무엇인지 이해한다고 말할 수 없으며 라이브러리에 포함된 서명에 대해 아무것도 모른다고 말할 수 없습니다. (흥미롭게 들립니다. 링커가 인수에서 유형 불일치를 확인할 수 있다는 의미입니까? 연결 반환 유형) 시간에? ELF에는 확실히 그러한 기능이 없습니다. ) 따라서 이 답변은 비교 관점에서 나온 것이 아닙니다. 또한 귀하의 질문이 매우 광범위하기 때문에 답변은 피상적일 것입니다.
예, 정적 라이브러리( .a
) 또는 공유 라이브러리( .so
)를 생성할 수 있습니다. 링커가 요청을 사용하는 라이브러리를 찾을 때 -l
와 같은 옵션으로 재정의되지 않는 한 둘 다 존재하는 경우 공유 라이브러리를 선호합니다 -static
.
소스에서 라이브러리를 빌드할 때 정적 라이브러리( .a
) 또는 공유 라이브러리( .so
)로 빌드하면 됩니다. 둘 다는 아닙니다. 그럼에도 불구하고 라이브러리 사용자가 링크할 버전을 선택할 수 있도록 빌드 스크립트가 두 가지 버전을 빌드하도록 설정된 패키지가 꽤 많이 있습니다(한 번은 위치 독립적 코드를 사용하고 한 번은 사용하지 않고 두 번 컴파일해야 함). .
정적 라이브러리의 필요한 부분은 빌드된 바이너리에 완전히 병합됩니다. .a
런타임 시 이 파일을 제공할 필요가 없습니다 . 대신 바이너리에 연결된 공유 라이브러리는 런타임에 사용할 수 있어야 합니다. 하지만 런타임 동적 링커는 일반적으로 수정된 이름 "soname"(보통 libsomething.so
링크 타임과 libsomething.so.<integer>
런타임 모두)으로 이를 검색하지만 두 가지를 모두 허용하는 기능이 있습니다. 약간 다른 API를 사용하여 시스템에 설치된 다른 버전의 라이브러리.
귀하의 질문에서 런타임에 명시적으로 동적 라이브러리를 로드한다고 언급하셨습니다. 이는 일반적으로 모듈식 애플리케이션이나 플러그인이 있는 애플리케이션에 대해 수행됩니다. 이 경우 관련 라이브러리(종종 "모듈" 또는 "플러그인"이라고 함)는 애플리케이션과 전혀 연결되지 않으며 빌드 타임 링커는 이에 대해 아무것도 모릅니다. 대신, 애플리케이션 개발자는 런타임 동적 링커를 호출하고 파일 이름이나 전체 경로 이름으로 라이브러리를 열도록 요청하는 코드를 작성해야 합니다. 때로는 켜질 모듈의 이름이 응용 프로그램의 구성 파일에 나열되거나 어떤 모듈이 필요하거나 필요하지 않은지 결정하는 다른 응용 프로그램 논리가 있습니다.