2011-10-20 2 views
11

내가 libA 있다고 가정 해보십시오. 예를 들어 libSomething은 libA의 비 인라인 메서드가 libSomething.h의 메서드를 호출한다는 단순한 사실에 달려 있습니다. 이 경우 종속성 연결은 어떻게됩니까? libA가 컴파일 될 때 libAomething에 정적으로 링크해야합니까, 아니면 libA (libA를 사용하는 응용 프로그램)의 사용자가 libA와 libSomething을 모두 링크해야합니까?정적 라이브러리는 종속성에 어떻게 링크합니까?

감사

답변

14

정적 링크는 결과 실행에 전체 항목 (함수, 상수 등)를 복사합니다. 정적 라이브러리의 코드에 일부 공유 라이브러리 항목에 대한 참조가 포함되어 있으면이 참조는 결과 실행 파일에 종속됩니다. 실행 가능 대신 라이브러리를 링크하는 경우에도 마찬가지입니다.

This thread은 Linux에서 어떻게 발생하는지 설명합니다.

+0

결과 실행 파일에 부담을주지 않으려면 어떻게해야합니까? – jmasterx

+1

@Milo : libSomthing의 종속 라이브러리의 정적 라이브러리를 libA에 연결할 수 있습니다. –

+0

@Milo : 즉, 공유 된 종속성을 원하지 않습니까? 그런 다음 정적 라이브러리 만 사용하여 정적으로 모든 것을 링크하면됩니다. 이로 인해 종속성이없는 큰 독립적 인 실행 파일이 만들어집니다. 그러나 일부 라이브러리를 정적 라이브러리로 구축하는 것은 어렵다는 경고를받습니다. – vines

4

컴파일 과정에서 컴파일러는 코드를 임시 형식으로 변환하고이를 객체 파일이라고 부릅니다. 오브젝트 파일에는 컴파일러가 해석 할 수없는 기호 목록이 있으며 대개 정의가 다른 곳에서 정의됩니다. 연결 단계는 이러한 기호를 해결하는 역할을 담당합니다.

빌드 프로세스는 모든 기호가 해석 될 때까지 파일을 링커에 공급합니다. 물리적 종속 목록은 없으며 해결할 기호 목록 만 있습니다. 이렇게하면 다른 라이브러리를 사용하여 기호를 해석 할 수 있습니다. 예를 들어, Windows 특정 문제에 대해 Windows 라이브러리를 사용하고자 할 수 있습니다. 리눅스 특정 문제에 대한 리눅스 라이브러리. 이것은 프로그램이 Windows 라이브러리에 종속되어 있음을 명시 적으로 나타내지는 않습니다. 그것은 또한 리눅스에 의존 할 수도있다.

일부 컴파일러는 일반적으로 빌드 프로세스에서 사용하기 위해 종속성 목록을 생성 할 수 있습니다. 그러나 궁극적 인 책임은 프로그래머에게 달려 있습니다.

6

정적 라이브러리는 링크되지 않은 이진 객체 파일 (* .o 또는 * .obj)의 단순한 아카이브이며, 아카이브를 컴파일 할 때 종속성에 대한 검사는 수행되지 않습니다. 하나의 바이너리 실행 파일 (또는 공유 라이브러리/DLL)을 링크하면 링커는 필요한 모든 의존성을 검사 한 다음에 만 문제를 알려줍니다.

관련 문제