boost中g++ 链接undefined reference to `boost::system::generic_category()问题

在使用Boost库时遇到的不确定引用问题,通过在g++编译链接选项中加入-lboost_system,成功解决了编译链接阶段库未包含的问题。

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

在使用boost库时,遇到了一个比较纠结的问题:

Test.cpp:(.text+0x1bd): undefined reference to `boost::system::generic_category()'
Test.cpp:(.text+0x1c7): undefined reference to `boost::system::generic_category()'
Test.cpp:(.text+0x1d1): undefined reference to `boost::system::system_category()'
放狗搜了下,感觉问题也是因而而异,但是普遍反映是在编译链接时,有库没有包含进去,我试了下,在g++的编译链接选项里加上 -lboost_system,即解决了问题,

### 解决方案 当遇到`undefined reference to boost::iostreams::detail::bzip2_base::~bzip2_base()`错误时,通常是因为链接器未能找到Boost.Iostreams中的实现部分。以下是可能的原因以及解决方案: #### 原因分析 1. **未正确链接Boost Iostreams** Boost.Iostreams依赖于特定的子模块(如BZip2),这些子模块需要显式链接才能正常工作[^1]。 2. **缺少必要的外部支持** 如果使用了压缩相关的功能(例如BZip2或ZLib),则还需要确保系统上已安装对应的第三方并将其链接到项目中[^3]。 3. **CMake配置不完整** 在CMakeLists.txt文件中仅指定了`-lboost_system`或其他单个组件,而忽略了其他必需的部分,比如`boost_iostreams`及其依赖项[^2]。 --- #### 实现步骤说明 ##### 方法一:手动指定链接选项 在命令行调用g++编译时,需加入额外参数来指示链接器加载所需的动态共享对象(DSO),即`.so`文件形式的预构建版本或者静态档案(.a)格式的目标代码集合体。对于涉及BZIP操作的情况来说,则应该附加如下标志之一: ```bash -lboost_iostreams -lbz2 ``` 这表示除了引入标准输入输出流扩展外还要关联由libbz2.so所提供的二进制接口定义。 ##### 方法二:修正CMake脚本设置 假设采用的是基于CMake工具链管理方式的话,在SET语句里补充完整的LIBS列表即可满足需求。具体修改后的片段可参照下面例子所示: ```cmake set(LIBS ${OpenCV_LIBS} ${EIGEN3_LIBS} ${Pangolin_LIBRARIES} ${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so ${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so ${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so -lboost_system -lboost_iostreams -lbz2 ) ``` 通过这种方式可以保证所有必要环节都被纳入最终产物之中。 ##### 方法三:重新编译Boost源码包 如果以上两种途径均无法奏效,那么最后一种可行的办法就是自行下载官方发布的最新稳定版tarball归档文件,并按照官方文档指导完成本地化定制过程。特别需要注意的一点是在执行初始化引导脚本(`./bootstrap.sh`)之前先确认已经具备全部前置条件——尤其是关于MPI的支持状况;另外记得更新user-config.jam配置文件以反映实际环境布局变化情况。 --- ### 示例代码展示 以下是一个简单的测试案例用于验证修复效果如何生效: ```cpp #include <boost/iostreams/filtering_stream.hpp> #include <boost/iostreams/filter/bzip2.hpp> int main(){ std::ifstream file("example.bz2",std::ios_base::in | std::ios_base::binary); boost::iostreams::filtering_istream in; in.push(boost::iostreams::bzip2_decompressor()); in.push(file); char c; while(in.get(c)){ putchar(c); } return 0; } ``` 为了成功运行上述程序,请确保遵循前述提到的各种调整措施之后再尝试再次构建工程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值