2017-04-03 2 views
2

정적 라이브러리 A에 의존하는 실행 파일을 만들고 있어요 정적 라이브러리 B에 의존합니다. 응용 프로그램을 빌드 할 때 빌드 스크립트에서 B에 대해서도 링크해야합니까?정적으로 링크 된 라이브러리는 종속성과의 연결이 필요합니까?

더 구체적으로 말하면 -la -lb을 수행해야합니까, 아니면 -la을 통해 A와 연결하기 만하면됩니까?

+0

어떤 운영체제에 있습니까? –

+0

@BasileStarynkevitch Linux. – jeffreyveon

+0

그 질문에 (아마도 태그로) 가야한다. –

답변

2

A 작성 방법에 따라 두 라이브러리를 링크해야 할 수도 있고 그렇지 않을 수도 있습니다.

A에 링커가 라이브러리 B에서 기호 (일반적으로 A에 포함 된 개체 파일 중 하나에 포함되어 있음)를 찾도록 지시하는 링커 주석 레코드가 포함되어있는 경우 링크 할 때 B를 포함 할 필요가 없습니다. A에 해당 주석 레코드가 포함되어 있지 않으면 직접 포함시켜야합니다.

-1

정적 라이브러리는 컴파일하는 동안 사용하는 프로그램에 완전히 포함되어 있으므로 프로그램을 실행하는 데 추가 파일이 필요하지 않습니다.

라이브러리 A가 이미 정적 라이브러리 B로 빌드 된 경우 A는 B를 이미 가지고 있으므로 다시 필요하지 않습니다.

+0

나는 이것이 정확하다고 생각하지 않는다. 정적 라이브러리는 여전히 링커가 불평 할 수있는 해결되지 않은 종속성을 가질 수 있습니다. 컴파일하는 동안 각 라이브러리는 해당 라이브러리 컴파일 단계에서 적어도 종속 라이브러리의 헤더 파일에 액세스해야합니다. 그러나 종속 라이브러리에 링크하려는 시도는 없으므로 프로젝트에 동일한 라이브러리의 여러 복사본이 포함될 수 있습니다. 정적 라이브러리 프로젝트에 연결 단계가 없습니다. – PaulHK

+0

@ PaulHK 그리고 정확히 이미 컴파일 된 정적 라이브러리 A가 무엇에 대해서 불평 할 때입니까? A가 이미 컴파일 된 경우 B 부분이 완료됩니다. 전체 프로그램에서 A를 사용하려면 컴파일해야합니다. – deviantfan

+2

라이브러리 A는 링커 패스가있는 프로젝트에 포함되기 전까지는 종속성에 대해 불평하지 않습니다. 라이브러리를 컴파일 할 때 종속 라이브러리에 링크 할 필요가 없으므로 라이브러리가 객체 파일이 아닌 종속 라이브러리 헤더에 대한 액세스 만 필요로한다고 언급 한 이유는 무엇입니까? – PaulHK

0

A와 B가 정적 인 경우 A와 B의 순서대로 두 가지를 연결해야합니다 (-la -lb). 주문에 대한 설명은 this reply을 참조하십시오.

정적으로 링크 된 프로그램에는 실행 파일 내부에 링크 된 라이브러리가 포함되어 있습니다.

A 내부에 프로그램 호출 foo()이 있고 A 내부에 bar()이 호출된다고 상상해보십시오. 따라서 A가 프로그램의 일부가되면 프로그램에 bar()에 대한 정의되지 않은 호출이 있으므로 B와 연결해야합니다.

@ 1201ProgramAlarm에서 언급 한대로 이 사용 된 경우 (#pragma comment(lib, libname))는 예외입니다.

관련 문제