[工程编写]CMakeLists.txt 如何编写

最近开始写一些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})
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值