1. 一个实例
# 定义cmake版本
cmake_minimum_required( VERSION 2.8 )
# 工程名称
project ( myslam )
# 定义变量 下面的是编译器设置的变量,就是定义编译器条件
set( CMAKE_CXX_COMPILER "g++" )
set( CMAKE_BUILD_TYPE "Release" )
set( CMAKE_CXX_FLAGS "-std=c++11 -march=native -O3" )
# cmake_modules 给find_package提供 寻找路径
list( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules )
# 设置编译后的执行文件输出路径
set( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin )
# 设置编译后的依赖库文件输出路径
set( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib )
############### dependencies ######################
# Eigen
include_directories( "/usr/include/eigen3" )
# OpenCV
find_package( OpenCV 3.1 REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
# Sophus
find_package( Sophus REQUIRED )
include_directories( ${Sophus_INCLUDE_DIRS} )
# G2O
find_package( G2O REQUIRED )
include_directories( ${G2O_INCLUDE_DIRS} )
set( THIRD_PARTY_LIBS
${OpenCV_LIBS}
${Sophus_LIBRARIES}
g2o_core g2o_stuff g2o_types_sba
)
############### source and test ######################
# 顶层的 CMakeList.txt 文件中使用 add_subdirectory 告诉cmake去子目录寻找新的CMakeList.txt 子文件
include_directories( ${PROJECT_SOURCE_DIR}/include )
# 添加子文件夹
add_subdirectory( src )
add_subdirectory( test )
最终效果如下:
- 上面说到去子目录找CMakeList.txt 子文件 (src),子文件的内容是:下面只是一个例子而已。
add_library( myslam SHARED
frame.cpp
mappoint.cpp
map.cpp
camera.cpp
config.cpp
visual_odometry.cpp
)
target_link_libraries( myslam
${THIRD_PARTY_LIBS}
)
2. CMake 变量
- 隐式变量 —— Cmake自带的一些系统变量,列如:
PROJECT_BINARY_DIR
,` _BINARY_DIR
`等等。
- 显式变量 —— 自定义变量 用
set
来定义。
3. export 命令
-
可以将构建目录导入cmake库(类似吧),方便外部项目搜索。
-
用法:
export(PACKAGE <name>)
,注意此命令需要有<name>Config.cmake
文件在你的build
文件里面。
4. CONFIGURE_FILE 命令
- 将一份文件拷贝到另一个位置并修改它的内容。可以用来生成上面的
<name>Config.cmake
文件。