src下的CMake和功能包里的CMake有什么区别
时间: 2025-03-04 08:32:06 浏览: 12
src目录下的CMakeLists.txt与功能包内部CMakeLists.txt的作用和配置差异
作用区别
对于位于项目根目录即src
目录下的CMakeLists.txt
而言,其主要职责在于统筹整个项目的构建流程。这包括但不限于指定最低版本需求、定义全局属性以及引入各个子模块或子目录中的组件[^1]。
而处于具体功能包内的CMakeLists.txt
则更侧重于该独立单元自身的细节管理。例如,在多层嵌套结构里(如提供的例子所示),各子文件夹里的CMakeLists.txt
负责各自部分的源码编译成目标产物(像共享库.so
)、设定本地化的编译选项或是处理依赖关系等事务[^2]。
配置差异实例展示
考虑到一个典型的ROS工作空间布局:
my_robot_ws/
├── build/
├── devel/
└── src/
├── package_a/
│ └── CMakeLists.txt
└── CMakeLists.txt (顶层)
- 顶层
src/CMakeLists.txt
此位置的CMakeLists.txt
通常较为简洁,主要用于初始化环境并调用其他子目录下的同名文件来完成进一步的任务分配。下面是一个简单的模板示例:
cmake_minimum_required(VERSION 3.0.2)
project(my_robot_workspace)
# 设置默认构建模式为Release
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE)
endif()
# 寻找catkin以及其他必要的ROS工具链组件
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs)
# 将当前路径加入到Python解释器搜索路径中以便加载setup.py
set(PYTHONPATH ${PYTHONPATH}:$ENV{PWD}/devel/lib/python2.7/dist-packages)
# 添加所有子目录作为单独的功能包进行处理
file(GLOB children RELATIVE ${CMAKE_SOURCE_DIR} "${CMAKE_SOURCE_DIR}/*")
foreach(dir ${children})
add_subdirectory(${dir})
endforeach()
上述脚本通过遍历src
目录下的每一个条目,并利用add_subdirectory()
命令将其纳入整体构建体系之中[^4]。
- 功能包内
package_a/CMakeLists.txt
相比之下,这类CMakeLists.txt
会更加关注局部特性定制化方面的工作。这里给出一段可能存在于某个名为package_a
的功能包之中的代码片段:
cmake_minimum_required(VERSION 3.0.2)
project(package_a)
find_package(catkin REQUIRED COMPONENTS message_generation geometry_msgs sensor_msgs nav_msgs tf)
add_message_files(
FILES
MyCustomMsg.msg
)
generate_messages(
DEPENDENCIES
std_msgs
)
catkin_package(
CATKIN_DEPENDS message_runtime geometry_msgs sensor_msgs nav_msgs tf
)
include_directories(
${catkin_INCLUDE_DIRS}
)
add_executable(talker_node src/talker.cpp)
target_link_libraries(talker_node ${catkin_LIBRARIES})
install(TARGETS talker_node DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
这段配置不仅指定了消息类型的生成逻辑,还明确了可执行文件及其链接库的信息;同时安排了安装规则以确保最终制品能够被正确部署到位[^3]。
阅读全文
相关推荐


















