使用boost的动态库在ARM架构上构建时具有未定义的引用

dynamic library using boost has undefined references when built on ARM architecture

本文关键字:构建 未定义 引用 动态 boost 使用 ARM      更新时间:2023-10-16

我有一个基于C++的动态库,我为严重依赖boost的3大操作系统构建了这个库。目前,我正在为树莓派编译它。我花了一段时间才找到神奇的词语来构建库(-frepo作为编译器标志是关键,但我承认我不确定为什么会这样)。

现在,当我尝试链接到库时,我的库发出的每个boost调用都会出现"未定义引用"错误,即:

//`libmylib.so`: undeifined reference to `boost::shared_ptr<boost::detail::thread_data_base>::shared_ptr()'

当我构建libmylib.so时,我还构建了一个自定义版本的boost作为libboost.a。这一切在其他操作系统和非ARM架构上都可以很好地编译和链接,所以我尝试将-lboost作为标志之一,但我仍然从libmylib.so中得到了大量未定义的引用错误。

不用说,我所有的路都是正确的。

链接在树莓派上的行为似乎与在其他linux系统上的行为有所不同。例如,我构建了一个使用libpthread的静态库(libmythread.a)。当我链接到那个libmythread.a时,我也会得到未定义的引用错误,除非我在构建配方中也使用-lpthread。在我运行Fedora的Thinkpad上,我永远不必这样做,因为我在静态库libmythread.a的编译中包含了-lpthread

我很想找到一个教程或指南来解释这些差异。我也很想战胜他们!

我还在传统的linux机器上尝试了同样的构建,一切都连接得很好,没有问题。至少我知道我的构建过程是可以的。不过,这确实打开了一种可能性,即-frepo标志正在做一些我不理解的有趣的事情,这可能是问题的根源。

已解决。最终,问题源于-frepo标志。这对于编译一个名为legacy_abi.cpp的文件是必要的,该文件是我库的一部分,以允许第三方开发人员使用更旧、更奇特的操作系统/编译器。Pi不需要这一点,所以我只是从构建中的违规文件中删除了它,去掉了-frepo标志,并很高兴。

最后一点,天赋(无论如何,对于圆周率)只提供了1.49的提升(据我所知)。我的项目需要提升>=1.50。这是一个继承下来的项目,所以我仍然在发现它所有的小特质。