c++ - GCC C++ 在创建库时链接 boost

标签 c++ gcc boost static

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

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

我遇到的问题是我找到的示例没有告诉您如何链接库中的其他库。我的库使用 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/lib/libboost_system.a build/Application.o build/DataBlock.o (等等,后面列出了我所有的目标文件)

但是当我稍后链接到我创建的 .a 文件时,它会给出 undefined reference 错误。

我设法通过在 Mac 上构建共享库 SO 文件来创建我的库,但在该系统上,Boost 安装在标准系统位置。当我在 Linux 上构建共享库时,出现错误“/usr/lib/crtbegin.o 中的隐藏符号 `__dso_handle' 被 DSO 引用”,并且我经常遇到无法找到 Boost .SO 文件的问题。因此我决定改为静态链接。

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

谢谢。如果有任何不清楚的地方或您需要更多详细信息,请询问。

一些缺失的引用是:

对 `boost::thread::interrupt()' 的 undefined reference

boost/boost/thread/pthread/thread_data.hpp:247: 对 `boost::this_thread::hiden::sleep_until(timespec const&)' 的 undefined reference

boost/boost/archive/detail/iserializer.hpp:158: 对 `boost::archive::detail::basic_iserializer::~basic_iserializer()' 的 undefined reference

它们似乎都在 Boost 中。它找不到应该在 Boost 文件中的引用。

有关更多信息,这是我正在编译的内容:

ar rcs build/libppmi.a ../../boost/lib/libboost_system.a ../../boost/lib/libboost_iostreams.a ../../boost/lib/libboost_serialization.a . ./../boost/lib/libboost_thread.a build/Application.o build/DataBlock.o build/Iteration.o build/Launcher.o build/Message.o build/Network.o build/Processes.o build/DataBlockManager .o build/Communicator.o build/NetworkServer.o build/NetworkClientSession.o build/NetworkMessage.o build/NetworkConnection.o build/Threadable.o build/BuddyManager.o

这工作正常。这是当我使用它打破的文件。我还尝试从 boost 库中提取 .o 文件,但这会导致有关 pthread 库的其他链接器错误。

最佳答案

您正在创建文件的文件,但是当链接器在文件中查找时,它需要目标文件。链接器将查找 libppmi.a 并跳过所有非目标文件,包括 libboost_system.a,因为它不知道如何处理它们,所以不会找到任何 boost 符号。您可以通过 -t 链接来确认(如果您使用 gccg++ 链接,则使用 -Wl,-t -t 传递给链接器),它在链接器处理文件时打印每个文件的名称,您会看到它不处理嵌套的存档。

如果你想在你的存档中包含所有的 Boost 代码,那么你需要列出各个对象(通过直接在你构建 Boost 的地方引用它们,或者从 Boost 存档中提取它们然后将它们添加到你的新存档中。 )

This works ok. It's when I use the archive it breaks.

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

I have also tried extracting the .o files from the boost libraries but this gives other linker errors about pthread libraries.

这是正确的方法,但您遇到了不同的问题,因此请解决该问题而不是放弃该方法。如果您使用的是 Boost.Thread,那么您需要使用 -pthread

进行编译和链接

关于c++ - GCC C++ 在创建库时链接 boost ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15317121/

相关文章:

c - 如何在configure.ac中使用宏__GNUC__和__GNUC_MINOR__

c++ - 使用挂起的 read_async_some 关闭 boost::asio::serial_port

c++ - 我如何实现嵌套的 boost::mpl::fold

gcc - 在 make 文件中指定构建目录

c++ - gcc 4.7 的可选和变体

c++ - 在 C++ 中将 begin() 和 end() 与集合一起使用

c++ - 什么是 boost 序列化 map 加载时间?

Java 外部函数接口(interface) (FFI) 与 C++ 互操作?

c++ - iOS - Xcode - OpenCV - findContours 错误

c++ - Linux函数以一定的间隔调用