Ubuntu下添加boost库

@Ubuntu下Boost库的链接

在CmakeLists.txt中添加Boost组件

Boost具有很好的平台独立性,因此可以作为首选api来完成特定功能。

最常用的为filesystem,用来获取程序的运行目录

#include <boost/filesystem/path.hpp>
#include <boost/filesystem/operation.hpp>

但是经常编译的时候会提示如下错误:

undefined reference to `boost::system::generic_category()'
undefined reference to `boost::system::system_category()'
.text._ZN5boost10filesystem12initial_pathEv[_ZN5boost10filesystem12initial_pathEv]+0x19): undefined reference to `boost::filesystem::detail::initial_path(boost::system::error_code*)'

有时也会提示:

Dso missing from command line

针对Boost,这种情况一般都是相应的库没有被正确的链接,BOOST的链接可以用以下两种方法:

用find_package
find_package(Boost REQUIRED COMPONENTS
filesystem   
#这里只使用了一个组件filesystem,如果想要找所有的Boost包含的库,直接find_package(Boost REQUIRED)
)
if(NOT Boost_FOUND)
    message("Not found Boost")
endif()

include_directories(${Boost_INCLUDE_DIRS}) #包含Boost的头文件
add_executable( exe_name src/process_template.cpp ) #创建可执行文件,即用该cpp文件生成可执行文件
target_link_libraries(process ${Boost_LIBRARIES})  #将Boost库链接到该可执行文件
#可以使用message查看一下find_package找的库或者头文件的位置
message("${Boost_INCLUDE_DIRS}")
message("${Boost_LIBRARIES}")
用set进行设置

就如上面所说,如果find_package找到的不是我们想要的版本,这是可以直接去指定Boost的find文件所对应的位置,同时也可以直接设定Boost_INCLUDE_DIRS,Boost_LIBRARIES 的位置:
例如我的boost头文件保存在/usr/include中,
对应的库文件在 /usr/lib/x86_64-linux-gnu中,则可以做如下设定:

set(Boost_INCLUDE_DIRS "/usr/include")
set(Boost_LIBRARIES " /usr/lib/x86_64-linux-gnu")
include_directories(${Boost_INCLUDE_DIRS})
add_executable( exe_name src/process_template.cpp )
#在库链接时可以与之前一样链接${Boost_LIBRARY},也可以链接指定的库
target_link_libraries(process libboost_filesystem.so libboost_system.so )

常用的组件就是filesystem和system两个部分;
同时foreach组件也会用到,主要是用于对循环程序结构的编译器级别实现,不依赖高级别的编译器,即再低级别的便一起上也能够运行编译;
具体的使用方法如下:

#include <boost/foreach.hpp> //包含对应的头文件
BOOST_FOREACH(rosbag::MessageInstance const m, view){
#这里使用的读取RODBAG中的数据,与for循环的功能类似
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章