Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将静态库链接到共享库?_C++_Linux_Static_G++_Shared - Fatal编程技术网

C++ 将静态库链接到共享库?

C++ 将静态库链接到共享库?,c++,linux,static,g++,shared,C++,Linux,Static,G++,Shared,背景: 我想把几个静态库链接到一个共享库中。原因是我希望我的应用程序使用我测试过的特定lib版本。我不想将静态版本作为共享库与我的应用程序一起提供。我创建了这个示例库和应用程序,以尽可能地简化。我想在链接过程中继续将共享库链接到应用程序 问题: 为什么我会收到下面列出的错误消息?我做错了什么?也许这不是linux上通常的做法,但是有可能吗?这是特定于增压的吗 ----图书馆 //example.cpp #include <boost/thread.hpp> void doit() {

背景:

我想把几个静态库链接到一个共享库中。原因是我希望我的应用程序使用我测试过的特定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. 
//example.cpp
#包括
void doit()
{
boost::线程t1;
}
#构建脚本
g++-Wall-fPIC-I/usr/include-c example.cpp-o example.o
g++-shared/usr/lib/libboost_thread.a/usr/lib/libboost_system.a
o-o libexample.so
#建造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
//main.cpp
#包括
void doit();
int main()
{

std::cout我认为最简单的方法是使用
--whole archive
链接器开关(关于这个主题还有更多问题,请参见此处)

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

因此,您需要使用版本脚本来隐藏从库中导出的内容(另请参见google获取链接器版本脚本),只留下
doit()
可见。在您的情况下,这样的版本脚本可能类似于:

{
global:
    doit*;
local:
    *;
}      

您还需要确保正在链接的静态库是使用
-fPIC
编译的(如果您没有调整它们的构建标志,这是不可能的),另一方面,您将在
i386
上受到性能损失,并且可能根本无法在
amd64
上链接。谢谢,我将尝试一下。我只需要先下载并重新编译boost。这个答案在解释时更进一步:不要这样做:静态库通常包含普通对象成员,而共享库包含定位独立代码。但是如果我用-fPIC重新编译静态libs呢?这会有帮助吗?