背景:將靜態庫鏈接到共享庫?
我想將幾個靜態庫鏈接到一個共享庫。原因是我希望我的應用程序使用我測試過的特定lib版本。我不想將靜態版本作爲共享庫發佈到我的應用程序中。我已經創建了這個樣本庫和應用程序以儘可能簡化。我想在鏈接過程中繼續將共享庫鏈接到應用程序。
問:
爲什麼我得到下列錯誤信息?我究竟做錯了什麼?也許這不是在Linux上做事的常用方式,但是可以這樣做嗎?這種提升是否具體?
----庫
//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中。在Ubuntu 10.04機器上使用apt-get安裝Boost版本1.40。
謝謝!
不要這樣做:靜態庫通常包含普通對象成員,而共享庫包含與位置無關的代碼。 –
但是,如果我用-fPIC重新編譯靜態庫,該怎麼辦?這會有幫助嗎? – mantler