创建库时GCC C ++链接提升

时间:2013-03-09 23:28:29

标签: 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文件时,它会给出未定义的引用错误。

我设法通过在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库带来其他链接器错误。

1 个答案:

答案 0 :(得分:1)

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

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

  

这没关系。这是我使用存档时它会中断。

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

  

我也尝试从boost库中提取.o文件,但是这会给pthread库带来其他链接器错误。

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