由于对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 即可。
在添加时出现错误不要心急,按照每次编译后的错误提示慢慢修改