Boost link出错, undefined reference

本文分享了一次因Boost库更新引发的编译错误经历,详细介绍了从问题定位到最终解决的全过程,包括清理旧配置、移除Boost库文件、降级并重新安装Boost库等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前几天还可以运行的程序今天竟然报错了。Error 内容:

“ undefined reference to `boost::archive::archive_exception::archive_exception(boost::archive::archive_exception const&)'”

 

思来想去,只是update过boost. 后来降级解决了,建议一下顺序:

1,在build文件夹中 rm -rf *, 删除所有cmake, make残留物, 然后build again,如果失败,到2

2,到安装boost库的文件夹,很可能是 /usr/lib /usr/include, 移除所有boost相关文件。比如,sudo rm -rf libboost_*

3, 下载低版本boost, 安装 (https://stackoverflow.com/questions/12578499/how-to-install-boost-on-ubuntu

4, 在build文件夹中 rm -rf *, 然后重新使用cmake、make build。

强调:之所以两次提到在build文件夹中 rm -rf *, 是因为后来降级boost后,build还是失败了,但是无心rm了所有build文件后,就成功了。。

<think>好的,用户问的是编译动态库时出现undefined reference错误的解决方法。我需要根据提供的引用内容来整理解决方案。首先,这个问题通常是因为链接阶段找不到符号定义,可能有几种原因。 引用[2]提到动态链接库在编译时需要确保依赖的库正确链接。如果编译.so时没有联编所需的库,比如忘记加-l参数,就会在后续链接时出错。所以需要检查编译命令是否包含所有依赖库的链接参数。 引用[3]的情况是调用C写的库在C++中出现问题,可能是因为没有使用extern "C"导致名称修饰不一致。这时候应该在头文件中用#ifdef __cplusplus包裹,确保C++正确识别C函数符号。 引用[4]交叉编译时出现boost库的错误,可能因为交叉编译工具链没有正确配置,或者boost库路径未正确指定。需要检查交叉编译环境中的库路径和链接顺序。 引用[5]提到使用gcc编译时链接数学库需要显式加-lm,而g++会自动链接。所以如果是C项目,确保添加了必要的链接选项,或者改用g++来编译。 综合这些情况,解决方案应该包括检查符号定义是否存在,确保依赖库正确链接,处理C/C++混合编程的符号问题,检查交叉编译环境,以及确认链接顺序和参数是否正确。步骤可能需要分情况讨论,比如检查代码实现、编译命令、extern "C"的使用、交叉编译配置等。同时,要给出具体的例子,比如CMake中添加target_link_libraries,或者gcc命令中添加-l参数。还要提醒用户注意链接顺序,依赖库放在后面。可能还需要检查库文件是否存在或路径是否正确。最后,总结常见原因和解决步骤,帮助用户系统排查问题。</think>### 编译动态库出现 "undefined reference" 错误解决方案 "undefined reference" 错误通常发生在**链接阶段**,表示编译器无法找到符号(函数、变量、类等)的具体实现。以下是常见原因及解决方法,分步骤说明: --- #### 1. **检查符号是否正确定义** - **问题根源**:动态库中未实现声明的函数/类,或实现代码未编译到库中。 - **解决方法**: - 确保`.cpp`文件包含了所有声明的实现(如引用[1]中缺失虚函数实现导致报错)。 - 检查 CMake/Makefile 是否将相关源文件加入编译目标: ```cmake # 正确写法:明确包含所有源文件 add_library(mylib SHARED sources/Graph.cpp sources/Other.cpp) # 引用[1]错误示例的修正 ``` --- #### 2. **依赖库未正确链接** - **问题根源**:动态库依赖其他第三方库(如数学库、Boost),但未在编译时链接。 - **解决方法**: - **显式添加链接库**: ```cmake target_link_libraries(mylib PRIVATE m) # 链接数学库,对应gcc的 -lm(引用[5]) target_link_libraries(mylib PRIVATE boost_date_time) # 解决Boost库错误(引用[4]) ``` - **注意链接顺序**:被依赖的库应放在命令的**右侧**,例如: ```bash gcc -shared -o libmylib.so mylib.o -luldict # 依赖库在右侧(引用[2]) ``` --- #### 3. **C/C++ 混合编程符号问题** - **问题根源**:C++编译器会对函数名进行修饰(Name Mangling),而C语言不会,导致符号不一致(引用[3])。 - **解决方法**: - 在C头文件中使用 `extern "C"` 包裹声明: ```cpp #ifdef __cplusplus extern "C" { #endif void Start_Play(char*); // 确保C++编译器使用C风格符号 #ifdef __cplusplus } #endif ``` --- #### 4. **交叉编译环境配置错误** - **问题根源**:交叉编译时工具链未正确指定库路径或版本(引用[4])。 - **解决方法**: - 明确指定交叉编译的库路径和头文件路径: ```cmake set(CMAKE_FIND_ROOT_PATH /opt/cross-toolchain) find_library(BOOST_LIB boost_date_time PATHS ${CMAKE_FIND_ROOT_PATH}/lib) ``` --- #### 5. **动态库加载路径问题** - **问题根源**:编译时链接成功,但运行时找不到库。 - **解决方法**: - 编译时指定 `rpath`: ```cmake set_target_properties(mylib PROPERTIES INSTALL_RPATH "$ORIGIN") # 相对路径加载 ``` - 运行时设置 `LD_LIBRARY_PATH`: ```bash export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH ``` --- ### 总结步骤 1. **验证符号实现**:检查代码是否缺少函数/类定义。 2. **检查编译命令**:确认所有依赖库已正确链接且顺序正确。 3. **处理 C/C++ 符号兼容性**:使用 `extern "C"`。 4. **交叉编译配置**:检查工具链和库路径。 5. **运行时路径配置**:设置 `rpath` 或环境变量。 若仍无法解决,可通过 `nm -D libxxx.so` 查看动态库导出的符号列表,确认缺失符号是否存在。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值