最近开始写一些SLAM工程,所以对涉及到的内容做一些整理,那么要做的第一件事情就是编写一个CMakeLists.txt。本文那任乾大佬在知乎关于雷达自动驾驶SLAM的工程距离。
1 信息指定
①cmake版本确定:
cmake_minimum_required(VERSION 3.1.0)
②工程名:
project(lidar_localization)
③工程选项设置:
SET(CMAKE_BUILD_TYPE "Release")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
add_compile_options(-std=c++11)
add_definitions(-std=c++11)
2 寻找依赖包
④findpackage:可以找到依赖包的头文件包含路径、库路径、库名字、版本号等,具体内容可以看该链接
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
pcl_ros
geometry_msgs
tf
eigen_conversions
)
3 路径包含
⑤include_directories:的作用为将指定目录添加到编译器的头文件搜索路径之下,指定的目录被解释成当前源码路径的相对路径,通常我们通过include_directories指定我们需要的文件所在路径来让程序知道程序在哪,详细内容看该链接
此时有一个include的妙用
由于各式各样的调用以及有时需要的if…else判断会导致CMakeLists很混乱,这时候将对每个包的调用内容写成一个.cmake文件放在一个固定的文件夹中,这是在CMakeLists中只要include这些.cmake文件即可,使得整个CMakeLists的结果很清晰。
include(cmake/glog.cmake)
include(cmake/PCL.cmake)
include(cmake/eigen.cmake)
include(cmake/geographic.cmake)
include_directories(include ${catkin_INCLUDE_DIRS})
include(cmake/global_defination.cmake)
4 添加执行文件
⑥add_executable:基于给定的源文件创建可执行文件,具体内容可看该链接
由于添加的源文件可能很多将导致CMakeLists很冗杂,此时可以用一个变量存储所有需要的源文件,最后将这个变量给add_executable即可。
file(GLOB_RECURSE ALL_SRCS "*.cpp")
file(GLOB_RECURSE NODE_SRCS "src/*_node.cpp")
file(GLOB_RECURSE THIRD_PARTY_SRCS "third_party/*.cpp")
list(REMOVE_ITEM ALL_SRCS ${NODE_SRCS})
list(REMOVE_ITEM ALL_SRCS ${THIRD_PARTY_SRCS})
add_executable(test_frame_node src/test_frame_node.cpp ${ALL_SRCS})
此处ALL_SRCS就是那个变量,通过file()
创建以及list()
增删。
5 连接库
⑦target_link_libraries:将给定的库文件名称连接到刚才创建的可执行文件,具体内容可看该链接
同样的,当链接的库很多时也会导致CMakeList很冗杂,此时可以定义一个变量,在之前3中的include部分将需要的库合并到这个变量中,最后给到target_link_libraries即可
set(ALL_TARGET_LIBRARIES "")
...include 内容...
target_link_libraries(test_frame_node ${catkin_LIBRARIES} ${ALL_TARGET_LIBRARIES})
此处ALL_TARGET_LIBRARIES就是那个变量,在include写好的.cmake文件时会通过list(APPEND ALL_TARGET_LIBRARIES ${XX_LIBRARIES})
将需要的库合并进来。
变量和选项
CMAKE_BUILD_TYPE:指定编译类型,常见的为Debug和Release
CMAKE_CXX_FLAGS_RELEASE:编译Release版本的时候采用的编译选项
add_compile_options():添加编译选项,同SET(CMAKE_CXX_FLAGS …) + SET(CMAKE_C_FLAGS)效果相同,例:add_compile_options(-std=c++11)即对c++和c编译时都加上c++11支持选项,链接
add_definitions():用于添加标志位,链接
最终CMakeLists.txt
cmake_minimum_required(VERSION 2.8.3)
project(lidar_localization)
SET(CMAKE_BUILD_TYPE "Release")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
add_compile_options(-std=c++11)
add_definitions(-std=c++11)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
pcl_ros
geometry_msgs
tf
eigen_conversions
)
set(ALL_TARGET_LIBRARIES "")
include(cmake/glog.cmake)
include(cmake/PCL.cmake)
include(cmake/eigen.cmake)
include(cmake/geographic.cmake)
include_directories(include ${catkin_INCLUDE_DIRS})
include(cmake/global_defination.cmake)
catkin_package()
file(GLOB_RECURSE ALL_SRCS "*.cpp")
file(GLOB_RECURSE NODE_SRCS "src/*_node.cpp")
file(GLOB_RECURSE THIRD_PARTY_SRCS "third_party/*.cpp")
list(REMOVE_ITEM ALL_SRCS ${NODE_SRCS})
list(REMOVE_ITEM ALL_SRCS ${THIRD_PARTY_SRCS})
add_executable(test_frame_node src/test_frame_node.cpp ${ALL_SRCS})
target_link_libraries(test_frame_node ${catkin_LIBRARIES} ${ALL_TARGET_LIBRARIES})