1.
库文件总是在可执行文件之前构建
# CMake中指令不区分大小写
# ${} 表示取出变量中的值
####
# 项目名称, 名称后面为支持的语言,不写时默认支持所有语言
PROJECT(project_name [CXX][C][java])
# 或者
PROJECT(name )
# PROJECT(...)语句运行之后,会默认定义两个变量,后面可以直接使用
# name_BINARY_DIR 编译目录
# name_SOURCE_DIR 工程目录
ADD_SUBDIRECTORY( ${PROJECT_SOURCE_DIR}/src ) //添加子目录
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) //设置可执行文件的输出路径
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) //设置库文件的输出路径
file(GLOB_RECURSE ALL_SRCS "cartographer_ros/*.cc" "cartographer_ros/*.h")
递归查找cartographer_ros文件夹下所以以.cc或.h结尾的文件,并把其值赋给ALL_SRCS。(下同)
file(GLOB_RECURSE ALL_TESTS "cartographer_ros/*_test.cc")
list(REMOVE_ITEM ALL_SRCS ${ALL_TESTS})从ALL_SRCS中移除ALL_TESTS变量所包含的文件。
// 将编译产生的文件安装到指定路径
cmake .. -DCMAKE_INSTALL_PREFIX=/home/llj/gitlib_ws/src/lomp/third_party/
2 catkin_package
我们在一些ros功能包的CMakeLists文件中经常可以看见catkin_package
catkin_package(
CATKIN_DEPENDS
diagnostic_updater
dynamic_reconfigure
geometry_msgs
nav_msgs
rosbag
roscpp
sensor_msgs
std_srvs
tf2
tf2_msgs
tf2_ros
INCLUDE_DIRS include
LIBRARIES amcl_sensors amcl_map amcl_pf
)
但是通过find_package()我们已经完成找头文件和库的目的了,那么catkin_package()要做什么呢
catkin_package()是catkin提供的CMake宏,用于为catkin提供构建、生成pkg-config和CMake文件所需要的信息。
有五个参数可选:
INCLUDE_DIRS - 声明给其它package的include路径
LIBRARIES - 声明给其它package的库
CATKIN_DEPENDS - 本包依赖的catkin package
DEPENDS - 本包依赖的非catkin package
CFG_EXTRAS - 其它配置参数
意思就是如果其他功能包使用本功能包的话
find_package(catkin REQUIRED
COMPONENTS)
catkin_INCLUDE_DIRS catkin_LIBRARIES
当中会包含我们在本功能包声明的include路径和库,对于DEPENDS依赖项,会将DEPENDS的头文件路径和库添加到本功能包下的include路径和库。
举个例子就是
catkin_package(
CATKIN_DEPENDS
diagnostic_updater
dynamic_reconfigure
geometry_msgs
nav_msgs
rosbag
roscpp
sensor_msgs
std_srvs
tf2
tf2_msgs
tf2_ros
INCLUDE_DIRS include
LIBRARIES amcl_sensors amcl_map amcl_pf
DEPENDS Boost
)
当前我的DEPENS包含了Boost库,当其他功能包调用这个功能包也需要Boost库的时候,就可以不需要再find_package(Boost)
但是如果功能包明确需要使用库的话,仍然建议显式寻找库find_package(Boost),而不是通过包含其他功能包隐式寻找,这么做的目的是避免其他功能包修改依赖项导致功能包编译失败。
3 set
set(PACKAGE_DEPENDENCIES
cartographer_ros_msgs
geometry_msgs
message_runtime
nav_msgs )定义变量PACKAGE_DEPENDENCIES
4 调试配置(vscode + catkin)
- 配置 launch.json
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch test_code", // 配置名称, 将会在调试配置下拉列表中显示
"type": "cppdbg", // 调试器类型 该值自动生成
"request": "launch", // 调试方式,还可以选择attach
"program": "${workspaceRoot}/devel/lib/test_code/qua_to_yaw", //要调试的程序(完整路径, 支持相对路径)
"args": [], // 传递给上面程序的参数, 没有参数留空即可
"stopAtEntry": false, // 是否停在程序入口点(停在main函数开始)
"cwd": "${workspaceFolder}", // 调试程序时的工作目录
"environment": [], // 针对调试的程序, 要添加到环境中的环境变量. 例如: [ { "name": "squid", "value": "clam" } ]
"externalConsole": false, // 如果设置为true, 则为应用程序启动外部控制台. 如果为false, 则不会启动控制台, 并使用VS Code的内置调试控制台.
"MIMode": "gdb", // VSCode要使用的调试工具
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
- 配置 tasks.json
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "catkin_make",
"type": "shell",
"command": "catkin_make", // catkin_make
"args": [],
"group": {
"kind": "build",
"isDefault": true
},
"presentation": {
"reveal": "always"
},
"problemMatcher": "$msCompile"
},
]
}
- 配置 CMakeLists.txt
在 CMakeLists.txt 中添加 set(CMAKE_BUILD_TYPE Debug) - ctrl + shift + b 编译
- 打断点调试
5 proto
find_package(Protobuf REQUIRED)
set(PROTO_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/protos/include)
include_directories(${PROTO_INCLUDE_DIR})
add_executable(lpms_nav3_node lpms_nav3_node.cpp)
target_link_libraries(lpms_nav3_node
${catkin_LIBRARIES}
protobuf
protos
)
6 CMAKE_MODULE_PATH
find_package(LuaGoogle REQUIRED)
error:
但是在 /home/llj/lomp/third_party/share/cartographer/cmake/modules 路径下却存在 FindLuaGoogle.cmake 文件
此时在CMakeLists.txt 中添加 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} “/home/llj/lomp/third_party/share/cartographer/cmake/modules”)即可,将FindLuaGoogle.cmake 文件所在的路径添加到 CMAKE_MODULE_PATH 变量中。
find_package 在查找查找包时,会在CMAKE_MODULE_PATH定义的路径下查找。
7 add eigen
在 CMakeLists.txt 同级目录创建文件夹 cmake,在 cmake 文件夹下创建文件 eigen.cmake,eigen.cmake 文件内容如下:
find_package(Eigen3 REQUIRED)
include_directories(${EIGEN3_INCLUDE_DIRS})
在 CMakeLists.txt 文件中添加语句 include(cmake/eigen.cmake)
即可实现对 eigen 库的添加。