《视觉SLAM十四讲精品总结》1:使用CMake和库文件
1、简单的cmake 使用
CMakeLists.txt文件告诉cmake我们要对这个目录下的文件做什么事情。
# 声明要求的 cmake 最低版本
cmake_minimum_required( VERSION 2.8 )
# 声明一个 cmake 工程
project( HelloSLAM )
# 添加一个可执行程序
# 语法:add_executable( 程序名 源代码文件 )
add_executable( helloSLAM helloSLAM.cpp )
2、使用库
程序由源文件和头文件组成。
可执行程序想调用库函数中的函数,需要在CMakeLists.txt中把可执行程序链接到库文件中
-
# 将库文件链接到可执行程序上
-
target_link_libraries( useHello hello_shared )
-
1、源文件useHello.cpp
//头文件
#include "libHelloSLAM.h"
int main( int argc, char** argv )
{
// 使用头文件中的 printHello() 函数
printHello();
return 0;
}2、头文件libHelloSLAM.h
头文件说明库文件中有哪些函数。
// 上面的宏定义是为了防止重复引用这个头文件而引起的重定义错误
#ifndef LIBHELLOSLAM_H_
#define LIBHELLOSLAM_H_
//声明函数
void printHello();
#endif库的生成
库文件源代码
//库文件void而不是main
#include <iostream>
using namespace std;
void printHello()
{
cout<<"Hello SLAM"<<endl;
}CMakeLists.txt添加一句
# 共享库
add_library( hello_shared SHARED libHelloSLAM.cpp )3、CMakeLists.txt
# 声明要求的 cmake 最低版本
cmake_minimum_required( VERSION 2.8 )
# 声明一个 cmake 工程
project( HelloSLAM )
# 添加一个共享库
add_library( hello_shared SHARED libHelloSLAM.cpp )
# 可执行程序
add_executable( useHello useHello.cpp )
# 将上述两者add_library和add_executable连接起来
# 生成的库文件链接到可执行程序上
target_link_libraries( useHello hello_shared )
3、其他的大型库的CMakeLists.txtEigen线性代数库
Eigen是一个纯用头文件搭建起来的库,在使用时只需要在CMakeLists.txt中引用Eigen的头文件即可,不需要链接库文件。
#添加头文件
include_directories("/usr/include/eigen3")Sophus李代数库
添加Sophus库的头文件和库文件
find_package( Sophus REQUIRED ) #为了使用Sophus,需要使用find_package命令
include_directories( ${Sophus_INCLUDE_DIRS}) #添加头文件目录
add_executable( useSophus useSophus.cpp) #添加可执行文件
target_link_libraries( useSophus ${Sophus_LIBRARIES} ) #添加库文件目录OpenCV
find_package( OpenCV REQUIRED ) #寻找OpenCV库
include_directories( ${OpenCV_INCLUDE_DIRS}) #添加头文件
add_executable( imageBasics imageBasics.cpp) #添加可执行文件
target_link_libraries( imageBasics ${OpenCV_LIBS} ) #链接OpenCV库PCL点云库
find_package( PCL REQUIRED COMPOMENT common io )
include_directories( ${PCL_INCLUDE_DIRS}) #添加头文件目录
add_executable( joinMap joinMap.cpp) #添加可执行文件
target_link_libraries( joinMap ${PCL_LIBRARIES} ) #添加库文件目录Ceres非线性优化库
list( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules )
find_package( Ceres REQUIRED )
include_directories( ${CERES_INCLUDE_DIRS}) #添加头文件目录
add_executable( curve_fitting main.cpp ) #添加可执行文件
target_link_libraries( curve_fitting ${CERES_LIBRARIES} ) #添加库文件目录G2O图优化库
# 添加g2o的依赖
# 因为g2o不是常用库,要添加它的findg2o.cmake文件
LIST( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules )
SET( G2O_ROOT /usr/local/include/g2o )
FIND_PACKAGE( G2O )
include_directories( ${G2O_INCLUDE_DIRS} ) #添加头文件目录
add_executable( curve_fitting main.cpp ) #添加可执行文件
target_link_libraries( curve_fitting g2o_core g2o_stuff ) #添加库文件目录