undefined reference to `boost::detail::get_current_thread_data()‘错误解决

由于对ubuntu系统运行代码不太熟悉,在进行代码移植时,使用cmake .. ,和make,指令编译项目时出现以下错误,找了一晚上的解决方案,最后通过配置CMakeLists.txt文件解决。

运行编译错误如下。

/usr/bin/ld: CMakeFiles/gicp_align.dir/src/align.cpp.o: in function `void boost::this_thread::sleep<boost::date_time::subsecond_duration<boost::posix_time::time_duration, 1000000l> >(boost::date_time::subsecond_duration<boost::posix_time::time_duration, 1000000l> const&)':
align.cpp:(.text._ZN5boost11this_thread5sleepINS_9date_time18subsecond_durationINS_10posix_time13time_durationELl1000000EEEEEvRKT_[_ZN5boost11this_thread5sleepINS_9date_time18subsecond_durationINS_10posix_time13time_durationELl1000000EEEEEvRKT_]+0x221): undefined reference to `boost::detail::get_current_thread_data()'
/usr/bin/ld: align.cpp:(.text._ZN5boost11this_thread5sleepINS_9date_time18subsecond_durationINS_10posix_time13time_durationELl1000000EEEEEvRKT_[_ZN5boost11this_thread5sleepINS_9date_time18subsecond_durationINS_10posix_time13time_durationELl1000000EEEEEvRKT_]+0x42e): undefined reference to `boost::this_thread::interruption_point()'
/usr/bin/ld: align.cpp:(.text._ZN5boost11this_thread5sleepINS_9date_time18subsecond_durationINS_10posix_time13time_durationELl1000000EEEEEvRKT_[_ZN5boost11this_thread5sleepINS_9date_time18subsecond_durationINS_10posix_time13time_durationELl1000000EEEEEvRKT_]+0x5c1): undefined reference to `boost::detail::get_current_thread_data()'
/usr/bin/ld: align.cpp:(.text._ZN5boost11this_thread5sleepINS_9date_time18subsecond_durationINS_10posix_time13time_durationELl1000000EEEEEvRKT_[_ZN5boost11this_thread5sleepINS_9date_time18subsecond_durationINS_10posix_time13time_durationELl1000000EEEEEvRKT_]+0x78e): undefined reference to `boost::this_thread::interruption_point()'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/gicp_align.dir/build.make:193:gicp_align] 错误 1
make[1]: *** [CMakeFiles/Makefile2:107:CMakeFiles/gicp_align.dir/all] 错误 2
make: *** [Makefile:84:all] 错误 2

解决方案:

这是由于Boost库没有正确链接到的项目中,或者构建配置中缺少必要的标志造成的。

首先,检查系统上是否已经安装了Boost库。如果没有安装,可以通过包管理器安装,例如在Ubuntu上可以使用

sudo apt-get install libboost-all-dev

然后 在项目的CMakeLists.txt文件中,正确地包含Boost库

# 查找Boost库
find_package(Boost REQUIRED COMPONENTS thread)

# 包含Boost的头文件
include_directories(${Boost_INCLUDE_DIRS})

# 添加可执行文件
# gicp_align 为可执行文件,第二项为使用到使用到boost,align.cpp路径
add_executable(gicp_align src/align.cpp)

# 链接Boost库
target_link_libraries(gicp_align ${Boost_LIBRARIES})

展示一下我的CMakeLists.txt文件更改前后对比

更改前,我的CMakeLists.txt已经添加了执行文件gicp_align,在原基础上进行了添加。


### APPS ###
if(BUILD_apps)
  add_executable(gicp_align src/align.cpp)
  add_dependencies(gicp_align fast_gicp)
  target_link_libraries(gicp_align
    ${PCL_LIBRARIES}
    fast_gicp
  )

更改后

find_package(Boost REQUIRED COMPONENTS thread)
### APPS ###
if(BUILD_apps)
  add_executable(gicp_align src/align.cpp)
  include_directories(${Boost_INCLUDE_DIRS})
  add_dependencies(gicp_align fast_gicp)
  target_link_libraries(gicp_align
    ${PCL_LIBRARIES}
    ${Boost_LIBRARIES}
    fast_gicp
  )

最后保存重新cmake ..,make 即可。

在添加时出现错误不要心急,按照每次编译后的错误提示慢慢修改

### 解决方案 当遇到`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、付费专栏及课程。

余额充值