将一个静态库链接到共享库?

背景:

我想将几个静态库链接到共享库。 原因是我希望我的应用程序使用我testing过的特定的lib版本。 我不想将静态版本作为共享库发布到我的应用程序中。 我已经创build了这个样本库和应用程序,以尽可能简化。 我想在链接期间继续将共享库链接到应用程序。

题:

为什么我会收到下面列出的错误信息? 我究竟做错了什么? 也许这不是在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中。 升级,版本1.40,在Ubuntu 10.04机器上使用apt-get安装。

谢谢!

Solutions Collecting From Web of "将一个静态库链接到共享库?"

我认为最简单的方法是使用--whole-archive连接器开关(关于这个主题还有更多的问题,在这里看到一个如何将静态库链接到gcc中的动态库 )。

不足之处在于共享库将从Boost静态库中导出所有符号,如果您将在也使用Boost的应用程序中使用.so (但使用不同的版本或使用不同的开关编译),则可能会出现奇怪的问题。 。

因此,您需要使用版本脚本来隐藏从库中导出的内容(请参阅如何在共享库中隐藏导出的符号名称 ,而链接器版本脚本也是Google),只保留doit()可见。 在你的情况下,这样的版本脚本可能看起来像:

 { global: doit*; local: *; } 

你还需要确保你连接的静态库是用-fPIC编译的(如果你没有调整它的构建标志,这是不太可能的),否则你会在i386上有性能损失,而且可能不会链接在amd64