在ARM架构上构建时,使用boost的动态库具有未定义的引用 我有一个基于C++的动态库,我为3大OSS构建了它,它依赖于Boost。目前,我正在为树莓圆周率编译它。我花了一段时间才找到使库得以构建的神奇词汇(-frepo作为编译器标志是关键,但我承认我不确定为什么会出现这种情况)

在ARM架构上构建时,使用boost的动态库具有未定义的引用 我有一个基于C++的动态库,我为3大OSS构建了它,它依赖于Boost。目前,我正在为树莓圆周率编译它。我花了一段时间才找到使库得以构建的神奇词汇(-frepo作为编译器标志是关键,但我承认我不确定为什么会出现这种情况),c++,linux,boost,linker,raspberry-pi,C++,Linux,Boost,Linker,Raspberry Pi,现在,当我尝试链接到库时,我的库发出的每个boost调用都会出现“undefined reference”错误,即: //`libmylib.so`: undeifined reference to `boost::shared_ptr<boost::detail::thread_data_base>::shared_ptr()' /`libmylib.so`:boost::shared\u ptr::shared\u ptr()的未定义引用 当我构建libmylib.so时,我

现在,当我尝试链接到库时,我的库发出的每个boost调用都会出现“undefined reference”错误,即:

//`libmylib.so`: undeifined reference to `boost::shared_ptr<boost::detail::thread_data_base>::shared_ptr()'
/`libmylib.so`:boost::shared\u ptr::shared\u ptr()的未定义引用
当我构建
libmylib.so
时,我还将boost的自定义版本构建为
libboost.a
。这一切都可以在其他OSs和非ARM架构上进行编译和链接,因此我尝试将
-lboost
作为标志之一,但我仍然会从
libmylib.so
中得到大量未定义的引用错误

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

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

我很想找到一个教程或指南来解释这些差异。我也很想克服它们


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

已解决。最后,问题源于
-frepo
标志。这是编译名为
legacy_abi.cpp
的文件所必需的,该文件是我的库的一部分,允许第三方开发人员使用更老、更奇特的OSs/编译器。这在Pi上是不需要的,所以我只是从构建中的有问题的文件中删除了它,删除了
-frepo
标志,然后高兴了


最后一个注意事项是,智能(无论如何,对于Pi来说)只能提供高达1.49(据我所知)。我的项目需要boost>=1.50。这是一个继承的项目,所以我仍然在发现它所有的小特性。

也许我在这里错了,但它不是你应该链接到的
-lboost\u系统吗?
通常是的,但我使用的是一个定制的(精简和名称magled)版本,编译为libboost.a。我想我没有说得很清楚,斯瑞。我需要尝试链接到常规的旧boost,但我怀疑这不会有帮助。你能在libboost所在的位置放置一个
-L/dir吗?
?您是如何交叉编译还是按目标编译的?我有libboost位于/已经在makefile中的_l/dir。我一直在target上构建应用程序,因为它非常小,但我最初在Ubuntu桌面上使用arm-bcm2708-linux-gnueabi-g++构建了我的库。我也试着在target上建立这个库,同样的结果。我现在正试图通过交叉编译器构建应用程序,看看会发生什么。今晚回家之前,我会在target上开始构建一个常规系统boost,这样我也可以尝试一下——显然这需要4个小时。如果你尝试过raspian映像,你可以做一个
sudo apt get install boost
,也许你不必等待那4个小时。raspeberry pi有一个yocto元层,您还可以使用它来确保库正确交叉编译。一般来说,您不应该在目标上编译,因为这通常是一项相当耗时的任务。顺便问一下,你对系统有什么限制,SD卡空间有限吗?