繁体   English   中英

将静态库链接到共享库?

[英]Link a static lib into a shared lib?

背景:

我想将一些静态库链接到共享库。 原因是我希望我的应用程序使用我测试过的特定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中。 Boost,版本1.40,是在ubuntu 10.04机器上使用apt-get安装的。

谢谢!

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

这样做的缺点是您的共享库将导出Boost静态库中的所有符号,如果您在使用Boost的应用程序中使用.so (但是使用不同的版本或使用不同的开关编译),您可能会遇到奇怪的问题。

因此,您需要使用版本脚本来隐藏从库中导出的内容(请参阅如何在共享库中隐藏导出的符号名称 ,也可以使用谷歌搜索链接器版本脚本),只留下doit()可见。 在您的情况下,这样的版本脚本可能如下所示:

{
global:
    doit*;
local:
    *;
}      

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM