C++ GCC C&x2B+;创建库时链接boost

C++ GCC C&x2B+;创建库时链接boost,c++,gcc,boost,static,C++,Gcc,Boost,Static,我想我的问题是,当Boost只是编译并存储在我的主目录中,而不是系统中时,在创建归档文件时,静态链接到Boost的正确方法是什么?将我的程序创建为库的想法是,我将能够重新分发库文件,以便其他人在其程序中进行链接 我想制作一个C++链接库文件,我可以在Linux上链接到它。我真的不在乎它是静态的还是动态的,但静态可能会让我更容易 我遇到的问题是,我找到的示例没有告诉您如何链接库中的其他库。我的库使用Boost,我已经构建了Boost,但我没有将其移动到我的用户区域之外的权限 我尝试过制作如下静态归

我想我的问题是,当Boost只是编译并存储在我的主目录中,而不是系统中时,在创建归档文件时,静态链接到Boost的正确方法是什么?将我的程序创建为库的想法是,我将能够重新分发库文件,以便其他人在其程序中进行链接

<>我想制作一个C++链接库文件,我可以在Linux上链接到它。我真的不在乎它是静态的还是动态的,但静态可能会让我更容易

我遇到的问题是,我找到的示例没有告诉您如何链接库中的其他库。我的库使用Boost,我已经构建了Boost,但我没有将其移动到我的用户区域之外的权限

我尝试过制作如下静态归档:

编译cpp文件:

g++-O3-ffast math-Wall-Wextra-g-I./-I..//boost/-c BuddyManager.cpp-o build/BuddyManager.o

创建静态存档:

ar rcs build/libppmi.a.././boost/libboost\u system.a build/Application.o build/DataBlock.o(etc,后面列出了我的所有对象文件)

但当我稍后链接到我创建的.a文件时,它会给出未定义的引用错误

我通过在Mac上构建一个共享库来创建我的库,所以文件在Mac上,但在该系统上,Boost安装在标准系统位置。当我在Linux上构建一个共享库时,我遇到了一个错误:“dso引用了/usr/lib/crtbegin.o中的隐藏符号”`\uu dso\u handle',我经常遇到无法找到Boost.SO文件的问题。因此,我决定改为静态链接

该系统运行在Scientific Linux SL 5.3版(硼)上,我使用的是gcc-4.6.2。但是,我希望它能够移植到几乎所有版本的GCC中

谢谢。如果有什么不清楚的地方或者你想要更多的细节,请询问

缺少的参考资料包括: 对“boost::thread::interrupt()”的未定义引用

boost/boost/thread/pthread/thread_data.hpp:247:boost::this_thread::hiden::sleep_until(timespec const&)的未定义引用

boost/boost/archive/detail/iseralizer.hpp:158:对“boost::archive::detail::basic\u iseralizer::~basic\u iseralizer()”的未定义引用

它们似乎都在加速发展。它找不到应该在Boost归档中的引用

有关更多信息,请参阅以下内容: ar rcs build/libppmi.a.././boost/lib/libboost_system.a.././boost/libboost/libboost_iostreams.a.././boost/libboost_serialization.a.././boost/lib/libboost_thread.a build/Application.o build/DataBlock.o build/Iteration.o build/Launcher.o build/Message/Network.o build/processs.o build/DataBlockManager.o Communicator.obuild/NetworkServer.o build/NetworkClientSession.o build/NetworkMessage.o build/NetworkConnection.o build/Threadable.o build/BuddyManager.o


这样行。当我使用档案的时候,它就坏了。我还尝试从boost库中提取.o文件,但这会导致其他链接器关于pthread库的错误。

您正在创建存档文件,但当链接器在存档文件中查找时,它需要对象文件。链接器将在
libppmi.a
中查找并跳过所有非对象文件,包括
libboost\u system.a
,因为它不知道如何处理它们,因此找不到任何Boost符号。您可以通过链接
-t
(如果您使用
gcc
g++
进行链接,然后使用
-Wl,-t
-t
传递给链接器)来确认这一点,链接器在处理每个文件时打印文件的名称,您将看到它不会处理嵌套的归档文件

如果您想在归档文件中包含所有Boost代码,则需要列出各个对象(可以在构建Boost的地方直接引用它们,也可以从Boost归档文件中提取它们,然后将它们添加到新归档文件中)

这样行。当我使用档案的时候,它就坏了

当然,所有这些都会创建一个包含您列出的文件的存档。创建归档只需要将一堆单独的文件放在一个大文件中,您可以将任意类型的文件放在其中。它不会真的出错,但这并不意味着结果是正确的或可用的

我还尝试从boost库中提取.o文件,但这会导致其他关于pthread库的链接器错误


这是正确的方法,但是你遇到了一个不同的问题,所以要解决这个问题,而不是放弃这个方法。如果您使用的是Boost.Thread,那么您需要编译并链接
-pthread

缺少什么类型的符号?代码中的符号、boost中的符号还是看似无关的符号?你能给出一些符号名称吗?您很可能只是缺少存档中的一些文件。谢谢您的回复。我已经更新了问题以显示一些符号。为了明确起见,在创建归档文件和系统时,我还链接到Boost线程和序列化。那么,您至少缺少了
libboost\u线程。一个
加上一些其他线程。为什么不直接构建项目,然后使用
ldd
检查它使用的库呢?然后,您可以将它们打包到存档中(确保遵守相关许可条款)因此,我的归档文件的实际编译行是:ar rcs build/libppmi.a.././boost/libboost\u system.a.././boost/libboost/libboost\u iostreams.a.././boost/libboost/libboost\u serialization.a.././boost/lib/libboost\u thread.a build/Application.o build/DataBlock.o build/Iteration.o build/Launcher.o build/Message.o build/Network/processs.obuild/DataBlockManager.o build/Communicator.o build/NetworkServer.o build/NetworkClientSession.o build/NetworkMessage.o build/NetworkConnection.o build/Threadable.o build/BuddyManager.o这可以正常工作,但当我使用存档时,会出现引用错误。@rpame