CMake知识点

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)

  1. 配置 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
                }
            ]
        }
    ]
}
  1. 配置 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"
        },
    ]
}
  1. 配置 CMakeLists.txt
    在 CMakeLists.txt 中添加 set(CMAKE_BUILD_TYPE Debug)
  2. ctrl + shift + b 编译
  3. 打断点调试

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 库的添加。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值