2012-10-28 2 views
4

배경 :정적 라이브러리를 공유 라이브러리에 링크합니까?

나는 공유 LIB 몇 가지의 정적 libs와 연결합니다. 그 이유는 내 응용 프로그램이 그것을 테스트 한 특정 lib 버전을 사용하기를 원하기 때문입니다. 내 응용 프로그램과 정적 라이브러리를 공유 라이브러리로 제공하고 싶지 않습니다. 이 샘플 lib 및 응용 프로그램을 최대한 단순화하기 위해 만들었습니다. 연결하는 동안 공유 라이브러리를 응용 프로그램에 계속 링크하고 싶습니다.

질문 :

아래 나열된 오류 메시지가 나타나는 이유는 무엇입니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까? 아마도 이것은 리눅스에서 일하는 일반적인 방법이 아니지만 그렇게 할 수 있습니까? 이 특정 부양인가요?

---- 라이브러리

//example.cpp 
#include <boost/thread.hpp> 
void doit() 
{ 
    boost::thread t1; 
} 

#build script 
g++ -Wall -fPIC -I/usr/include -c example.cpp -o example.o 
g++ -shared /usr/lib/libboost_thread.a /usr/lib/libboost_system.a 
    example.o -o libexample.so 
#build OK. 

---- 샘플 응용 프로그램

//main.cpp 
#include <iostream> 
void doit(); 
int main() 
{ 
    std::cout << "main\n"; 
    doit(); 
    return 0; 
}; 

#build script. 
g++ -Wall -c main.cpp -o main.o 
g++ libexample.so main.o -o main 

#error message. 
libexample.so: undefined reference to `boost::thread::thread()' 
libexample.so: undefined reference to `boost::thread::~thread()' 
collect2: ld returned 1 exit status 

모든 소스 코드가 같은 디렉토리에 있습니다. Boost는/usr/lib 및/usr/include에 설치됩니다. Boost 버전 1.40은 우분투 10.04 시스템에서 apt-get을 사용하여 설치되었습니다.

감사합니다.

+0

은 그렇게하지 마십시오. –

+0

그러나 -fPIC을 사용하여 정적 라이브러리를 다시 컴파일하면 어떻게됩니까? 그게 도움이 되겠습니까? – mantler

답변

1

내가 가장 쉬운 방법은 --whole-archive 링커 스위치를 사용하는 것입니다.이 주제에 관해서는 더 많은 질문이 있습니다 (여기에서 how to link static library into dynamic library in gcc을 참조하십시오).

단점은 공유 라이브러리가 Boost 정적 라이브러리의 모든 심볼을 내 보냅니다. Boost를 사용하는 응용 프로그램에서 .so을 사용하는 경우 이상한 문제가있을 수 있지만 다른 버전이거나 다른 스위치).

doit() 만 남겨두면 라이브러리에서 내 보낸 내용을 숨기려면 버전 스크립트를 사용해야합니다 (How to hide the exported symbols name within a shared library, google도 링커 버전 스크립트 참조). 같은 귀하의 경우에는, 같은 버전의 스크립트를 볼 수 있었다 : 당신은 또한 당신이 연결하고있는 정적 라이브러리는 컴파일되어 있는지 확인해야합니다

{ 
global: 
    doit*; 
local: 
    *; 
}  

당신이 조정할하지 않은 경우, 가능성이 -fPIC (자신의 현명한 당신이 i386에 성능 저하를해야하고 amd64에 전혀 연결되지 않을 수도 있습니다 다른) 플래그를 구축 할 수 있습니다. 공유 라이브러리가 위치 독립적 인 코드를 포함하는 동안 정적 라이브러리는 일반적으로 일반 객체 멤버가 포함

+0

고마워, 나는 이것을 시도 할 것이다. 난 그냥 먼저 부스트를 다운로드하고 다시 컴파일해야한다. – mantler

+0

이 답변이 설명에 조금 더 간다 : http://stackoverflow.com/a/2649792/602340 – matiu

관련 문제