我想我的问题是在创建存档时静态链接到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上构建一个共享库时,我得到错误“隐藏符号`__dso_handle'在/usr/lib/crtbegin.o中被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库带来其他链接器错误。
答案 0 :(得分:1)
您正在创建存档存档,但是当链接器在存档中查找时,它需要对象文件。链接器将查找libppmi.a
并跳过所有非目标文件,包括libboost_system.a
,因为它不知道如何处理它们,因此不会找到任何Boost符号。您可以通过与-t
关联来确认(如果您使用gcc
或g++
进行关联,然后使用-Wl,-t
将-t
传递给链接器,在链接器处理它时打印每个文件的名称,您将看到它不处理嵌套的存档。
如果要在归档中包含所有Boost代码,则需要列出单个对象(可以直接在构建Boost的位置引用它们,也可以从Boost归档中提取它们,然后将它们添加到新归档中。 )
这没关系。这是我使用存档时它会中断。
当然,所有这一切都会创建一个包含您列出的文件的存档。创建存档只需要将大量单独的文件放入一个大文件中,您可以将almsot放在任何文件类型中。它确实不会出错,但这并不意味着结果是正确的或可用的。
我也尝试从boost库中提取.o文件,但是这会给pthread库带来其他链接器错误。
这是正确的方法,但你遇到了一个不同的问题,所以解决这个问题而不是放弃这个方法。如果您正在使用Boost.Thread,那么您需要编译并链接-pthread