c – 将静态库链接到共享库?
背景:
我想将一些静态库链接到共享库.原因是我希望我的应用程序使用我测试过的特定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 << "mainn"; 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,是在ubuntu 10.04机器上使用apt-get安装的. 谢谢! 解决方法
我认为最简单的方法是使用–whole-archive链接器开关(关于这个主题有更多的SO问题,请参见这里的一个
how to link static library into dynamic library in gcc).
这样做的缺点是您的共享库将导出Boost静态库中的所有符号,如果您在使用Boost的应用程序中使用.so(但是使用不同的版本或使用不同的开关编译),您可能会遇到奇怪的问题. 因此,您需要使用版本脚本来隐藏从库中导出的内容(请参阅How to hide the exported symbols name within a shared library,也可以使用google获取链接器版本脚本),只留下doit()可见.在您的情况下,这样的版本脚本可能如下所示: { global: doit*; local: *; } 你还需要确保你链接的静态库是用-fPIC编译的(如果你没有调整它们的构建标志,这是不太可能的),否则你将对i386产生性能损失,可能不会在amd64上链接. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |