使用boost的动态库在ARM架构上构建时具有未定义的引用
dynamic library using boost has undefined references when built on ARM architecture
我有一个基于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。这是一个继承下来的项目,所以我仍然在发现它所有的小特质。
- 在使用 GCC 4.8.5 构建的应用中对 cxx11 函数的未定义引用
- QT MYSQL 驱动器构建,未定义对"mysql_get_client_version@0"的引用
- 尝试构建 xerces c++ 解析器。Netbeans 和命令行构建错误未定义对"xercesc_3_2..."的引用
- 如何在 Linux 中构建共享库时使未定义引用的链接器失败
- 尝试使用 MinGW/CMake 构建 GLFW 示例时未定义的引用
- 错误:尝试在全新系统安装中构建应用程序后未定义对'...'的引用
- 在 macOS 上以C++构建的未定义符号
- C++ CMake 构建错误:未定义对"boost::throw_exception(std::exception const&)"的引用
- 自定义 Python 构建 - time.so:未定义的符号:PyExc_ValueError
- 尝试与从 CUDA 对象构建的共享库链接时未定义的符号
- 构建错误:未定义对"cv_bridge::CvImage::toImageMsg() const"的引用
- 使用RCPP与外部C 库构建R软件包时未定义的参考
- Google Protobuf 3:使用 CMAKE 构建时未定义的引用错误
- 架构 arm64 的未定义符号仅在构建框架时
- mac构建有一个未定义的符号,而linux构建并没有用于相同的代码
- 构建应用程序时未定义的引用错误;
- 对于 OpenCV 3.3.0 构建_ZN4half5_eLutE未定义
- 尝试构建C DLIB示例无法与数百个未定义的参考错误链接
- 对wxLog::DoLog的未定义引用在针对wxWidget 3.0构建wxHaskell时出错
- 构建php扩展时未定义的引用