我想我的问题是在创建档案时静态链接到 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 文件时,它会给出未定义的参考错误。
我设法通过在 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()'的未定义引用
boost/boost/thread/pthread/thread_data.hpp:247: 未定义引用`boost::this_thread::hiden::sleep_until(timespec const&)'
boost/boost/archive/detail/iserializer.hpp:158: 未定义对 `boost::archive::detail::basic_iserializer::~basic_iserializer()' 的引用
他们似乎都在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 库的链接器错误。