cmake 那些事儿~

安装cmake

centos系统可以配置yum源进行安装:

    yum install cmake

个人比较喜欢源码安装,痴情于自我掌握命运,附上cmake下载地址(http://www.cmake.org/download/),选择最新的稳定版即可。

其实源码安装只要你在Linux下尝试过一种,你就会发现此时天空飘来五个字“那都不是事“,有兴趣的可以参见gcc源码安装

代码结构

|—bin
|—include
|———a.h
|———b.h
|—etc
|—src
|———a.cpp
|———b.cpp
|———dir
|—————c.cpp
|—build
我的目录结构简介如下:

目录名描述
bin存放可执行文件
include存放源码头文件
etc存放配置文件
src存放源码实现文件
build用于cmake外部编译的目录

基本了解后就来看看cmake如何入手吧(备注:以下只阐述了我用到的要点,并不是cmake的全部,若有兴趣想深入了解的可以去查看官方文档)。

引入CMake

  • src同级目录编写主CMakeLists.txt文件
#指定服务名称
PROJECT(TestService)
#限定需要的cmake版本 若所在服务器版本低于此要求则报错
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
#设置基本的编译参数
SET(CMAKE_CXX_FLAGS "-g -std=c++11 -pthread")
#将程序所需的头文件所在目录引入,包括第三方的 多个之间空格分离
INCLUDE_DIRECTORIES(
${PROJECT_SOURCE_DIR}/include       
/usr/include/
)
#将程序依赖的库目录引入进来,多个之间空格分离
LINK_DIRECTORIES(/usr/lib /usr/local/lib)
#设置可执行文件输出路径
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#因为这是主CMake文件,引入源码所在目录,需要在该目录下编写CMakeLists.txt文件
ADD_SUBDIRECTORY(src)
  • src目录下编写子CMakeLists.txt文件
#指定服务名称  与主CMakeLists.txt相同
PROJECT(TestService)
#这个是俺最喜欢的一步,自动检索指定目录下的源码文件并存放到变量SRC_LIST中,简单方便
AUX_SOURCE_DIRECTORY(. SRC_LIST)
AUX_SOURCE_DIRECTORY(./dir SRC_DIR_LIST)
LIST(APPEND SRC_LIST ${SRC_DIR_LIST})
#组成依赖关系,最终将生成TestService可执行文件
ADD_EXECUTABLE(TestService ${SRC_LIST})
#将程序需要的库全部写在这,动态库和静态库皆可 若是系统自带的可以去除lib前缀,如libcurl.so可以直接写成curl
TARGET_LINK_LIBRARIES(TestService libprotobuf.so curl libmemcached.so  libAAA.a)

#下面的这段可以不需要,若要使用make install命令的话就需要在下面指定安装目录,因为大部分部署程序可能是用svn上拉下来的,安装时去除.svn即可,如下面的(PATTERN ".svn" EXCLUDE)
#cmake -DCMAKE_INSTALL_PREFIX=~  ..  
SET(INSTALL_DIR "TestService")
INSTALL(DIRECTORY ${PROJECT_SOURCE_DIR}/../etc 
    DESTINATION ${INSTALL_DIR}
    PATTERN ".svn" EXCLUDE)
INSTALL(DIRECTORY ${PROJECT_SOURCE_DIR}/../var 
    DESTINATION ${INSTALL_DIR}
    PATTERN ".svn" EXCLUDE)
INSTALL(TARGETS TestService 
        RUNTIME DESTINATION ${INSTALL_DIR}/bin)
  • 写完收工,开始编译
    我个人喜欢采用外部编译的方式,所以建了一个build目录
cd  build
cmake .. #该命令将生成makefile文件
make     #开始编译,若你的文件相当多,可以使用make -j命令进行开启多线程编译 速度杠杠的

若你需要部署服务,只要可执行文件和配置文件的话可以加上上面那一块:

#cmake -DCMAKE_INSTALL_PREFIX=~  ..  
SET(INSTALL_DIR "TestService")
#部署配置文件
INSTALL(DIRECTORY ${PROJECT_SOURCE_DIR}/../etc 
    DESTINATION ${INSTALL_DIR}
    PATTERN ".svn" EXCLUDE)
#部署日志文件目录  根据你的需求自适配
INSTALL(DIRECTORY ${PROJECT_SOURCE_DIR}/../var 
    DESTINATION ${INSTALL_DIR}
    PATTERN ".svn" EXCLUDE)
#部署可执行文件
INSTALL(TARGETS TestService 
        RUNTIME DESTINATION ${INSTALL_DIR}/bin)

编译命令将会是这样:

cd build
cmake -DCMAKE_INSTALL_PREFIX=~  ..  #CMAKE_INSTALL_PREFIX指定安装目录
make
make install

此时应该满足了大部分需求了,附上一本资料供参考学习

### 问题分析 在使用 `catkin_make` 构建包含非 `catkin` 包的工作区时,可能会遇到以下两个主要问题: 1. **CMake Warning**: `'Unknown build type ament_python for package rtabmap_python'`。这通常是因为 `ament_python` 是 ROS 2 中使用的构建类型,而 `catkin_make` 是为 ROS 1 设计的工具,不支持 `ament` 构建类型[^1]。 2. **CMake Error**: `'non-catkin packages in workspace'`。这是因为 `catkin_make` 预期工作区中的所有包都必须是 `catkin` 类型,而混合了非 `catkin` 包(如 `ament` 包)会导致此错误[^2]。 ### 解决方案 #### 使用正确的构建工具 对于 ROS 2 工作区,推荐使用 `colcon` 或 `ament` 构建工具,而不是 `catkin_make`。`colcon` 是 ROS 2 的官方构建工具,能够正确处理 `ament_python` 和其他类型的包[^3]。 以下是使用 `colcon` 构建工作区的示例: ```bash # 清理之前的构建文件 rm -rf build/ devel/ # 使用 colcon 构建工作区 colcon build --symlink-install ``` #### 分离工作区 如果必须同时使用 ROS 1 和 ROS 2 包,则可以将它们分离到不同的工作区中,并分别使用适合的构建工具。例如: - 对于 ROS 1 包,使用 `catkin_make` 或 `catkin_tools`。 - 对于 ROS 2 包,使用 `colcon`。 #### 修改 CMakeLists.txt 和 package.xml 如果需要强制兼容 `catkin_make`,可以尝试修改 `rtabmap_python` 包的 `CMakeLists.txt` 和 `package.xml` 文件,将其构建类型从 `ament_python` 更改为 `catkin`。但需要注意,这种方法可能会影响该包在 ROS 2 环境中的正常运行[^4]。 以下是修改示例: - 在 `package.xml` 中,确保 `<buildtool_depend>` 标签指向 `catkin`: ```xml <buildtool_depend>catkin</buildtool_depend> ``` - 在 `CMakeLists.txt` 中,添加以下内容以确保 `catkin` 构建系统的正确配置: ```cmake cmake_minimum_required(VERSION 3.0.2) project(rtabmap_python) find_package(catkin REQUIRED) catkin_package() include_directories(${catkin_INCLUDE_DIRS}) add_executable(your_executable_name src/your_source_file.cpp) target_link_libraries(your_executable_name ${catkin_LIBRARIES}) ``` #### 忽略非 `catkin` 包的警告 如果希望继续使用 `catkin_make` 并忽略非 `catkin` 包的警告,可以通过以下命令跳过对非 `catkin` 包的检查: ```bash catkin_make --force-cmake ``` 但这种方法并不推荐,因为它可能导致构建失败或不可预测的行为[^5]。 ### 总结 为了彻底解决上述问题,建议使用与目标 ROS 版本匹配的构建工具。对于 ROS 2 工作区,优先选择 `colcon`;对于 ROS 1 工作区,确保所有包均为 `catkin` 类型或分离工作区。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值