catkin_make install 使用解析

该文描述了一个CMake配置文件,用于管理C++11项目,使用catkin宏和Boost库。根据CPU架构(x86_64或aarch64)设置第三方库的头文件和库路径,并在构建过程中链接这些库。此外,文章还详细说明了如何安装和组织项目的头文件、库文件以及共享资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cmake_minimum_required(VERSION 2.8.3)
project(project_name)

## Use C++11
# add_definitions(-std=c++11 -Wall)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O3")
set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -Wall -std=c++11 -O3 -lpthread")

## Find catkin macros and libraries
find_package(catkin REQUIRED
  COMPONENTS
    message_generation
    roscpp
    sensor_msgs
    std_msgs
)



## Find system libraries
#find_package(Eigen3 REQUIRED)
find_package(Boost REQUIRED COMPONENTS system thread)


# add_message_files(
#   FILES
#   test.msg
# )

# add_service_files(
#   FILES
#   test.srv
# )

# generate_messages(
#   DEPENDENCIES
#   sensor_msgs
#   std_msgs
# )

catkin_package(
  INCLUDE_DIRS
    include
  LIBRARIES
    ${PROJECT_NAME}_core
  CATKIN_DEPENDS
    roscpp
    sensor_msgs
    std_msgs
  DEPENDS
    Boost
)



###########
## Build ##
###########


## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
  include
  ${catkin_INCLUDE_DIRS}
  ${Boost_INCLUDE_DIRS}
)

message("-- check cpu frame: ${CMAKE_HOST_SYSTEM_PROCESSOR}")

if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "x86_64" )
  message("x86_64-- Current cpu frame: ${CMAKE_HOST_SYSTEM_PROCESSOR}")
  include_directories(${PROJECT_SOURCE_DIR}/../third_party/2_x86_all/include)
  link_directories(${PROJECT_SOURCE_DIR}/../third_party/2_x86_all/lib)
  set(THIRD_PARTY_HEADERS ${PROJECT_SOURCE_DIR}/../third_party/2_x86_all/)
  set(THIRD_PARTY_LIBS ${PROJECT_SOURCE_DIR}/../third_party/2_x86_all/lib/)
else(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64")
  message("aarch64-- Current cpu frame: ${CMAKE_HOST_SYSTEM_PROCESSOR}")
  include_directories(${PROJECT_SOURCE_DIR}/../third_party/1_arm_all/include)
  link_directories(${PROJECT_SOURCE_DIR}/../third_party/1_arm_all/lib)
  set(THIRD_PARTY_HEADERS ${PROJECT_SOURCE_DIR}/../third_party/1_arm_all/)
  set(THIRD_PARTY_LIBS ${PROJECT_SOURCE_DIR}/../third_party/1_arm_all/lib/)
endif()


## Declare a cpp library
add_library(${PROJECT_NAME}_core
  src/test.cpp
)


## Declare cpp executables
add_executable(${PROJECT_NAME}_node
  src/${PROJECT_NAME}_node.cpp
  src/test_ros.cpp
)


## Add dependencies to exported targets, like ROS msgs or srvs
add_dependencies(${PROJECT_NAME}_core
  ${${PROJECT_NAME}_EXPORTED_TARGETS}
  ${catkin_EXPORTED_TARGETS}
)

add_dependencies(${PROJECT_NAME}_node
  ${${PROJECT_NAME}_EXPORTED_TARGETS}
  ${catkin_EXPORTED_TARGETS}
)

## Specify libraries to link executable targets against
target_link_libraries(${PROJECT_NAME}_core
  ${catkin_LIBRARIES}
  ${Boost_LIBRARIES}
  glog
  gflags
)

target_link_libraries(${PROJECT_NAME}_node
  ${PROJECT_NAME}_core
  ${catkin_LIBRARIES}
  ${Boost_LIBRARIES}
  -lrt
)


#############
## Install ##
#############

# Mark executables and/or libraries for installation

install(
  TARGETS ${PROJECT_NAME}_core
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

install(
  TARGETS ${PROJECT_NAME}_node
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} 
  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

# 安装项目结点头文件 可以指定目录include或其他
# file(GLOB_RECURSE ALL_LIBRARY_HDRS "include/*.h")
# set(INSTALL_SOURCE_HDRS ${ALL_LIBRARY_HDRS})
# foreach(HDR ${INSTALL_SOURCE_HDRS})
#   file(RELATIVE_PATH REL_FIL ${PROJECT_SOURCE_DIR}/include ${HDR})
#   get_filename_component(DIR ${REL_FIL} DIRECTORY)
#   install(
#     FILES ${HDR}
#     DESTINATION include/${PROJECT_NAME}/${DIR}
#   )
# endforeach()

# 安装第三方库头文件
install(DIRECTORY ${THIRD_PARTY_HEADERS}
        DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}/../third_party/
        FILES_MATCHING PATTERN "*.h")

# 安装第三方库库文件
install(DIRECTORY ${THIRD_PARTY_LIBS}
        DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION})

# Mark cpp header files for installation  
# 自动搜索统计目录下./inclue/下的*.h文件并安装至install/include/
install(
  DIRECTORY include/${PROJECT_NAME}/
  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
  FILES_MATCHING PATTERN "*.h"
)

# Mark other files for installation
install(
  DIRECTORY  launch
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
)

1.1、设置第三方库路径变量  

set(THIRD_PARTY_HEADERS ${PROJECT_SOURCE_DIR}/../third_party/1_arm_all/)
set(THIRD_PARTY_LIBS ${PROJECT_SOURCE_DIR}/../third_party/1_arm_all/lib/)

1.2、安装第三方库文件到install指定目录下

# 安装第三方库头文件 只搜索路径下 *.h文件 复制到 install/include/third_party/ 目录下
install(DIRECTORY ${THIRD_PARTY_HEADERS}
        DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}/../third_party/
        FILES_MATCHING PATTERN "*.h")

# 安装第三方库库文件 *.so *.a 到 install/lib/目录下
install(DIRECTORY ${THIRD_PARTY_LIBS}
        DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION})

2、安装一些共享文件或配置到 install/share/

# Mark other files for installation
install(
  DIRECTORY  launch
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
)

<think>我们正在讨论ROS中的构建工具:catkin_makecatkin build。根据提供的引用材料,我们可以总结如下: 1. **catkin_make**: - 是ROS早期使用的构建工具,基于CMakeMake。 - 它会在工作空间的根目录下创建一个统一的构建目录(`build`)和一个统一的开发空间目录(`devel`)。 - 缺点:它同时配置整个工作空间中的所有包,然后一次性构建。这可能导致包之间的依赖问题,特别是当工作空间中有多个相互依赖的包时,可能会因为编译顺序不当而失败。 - 另一个缺点是,它不支持并行构建多个独立包(因为整个工作空间被视为一个整体)。 2. **catkin build** (来自catkin_tools): - 是catkin_make的改进版本,属于catkin_tools工具集的一部分。 - 它采用“独立构建”(isolated build)的方式:每个包都在自己独立的构建空间中进行构建(在`build`目录下为每个包创建单独的子目录),然后合并到统一的开发空间(`devel`)中。 - 优点: - 支持并行构建(通过`-j`参数),提高构建速度。 - 更健壮地处理包之间的依赖关系,确保编译顺序正确。 - 允许用户构建工作空间中的特定包。 - 提供更多的命令,如`catkin list`(列出工作空间中的包)、`catkin clean`(清理构建产物)等。 - 它需要单独安装:`sudo apt install python3-catkin-tools` 3. **使用场景**: - **catkin_make**:适用于简单的工作空间,包数量较少且没有复杂的依赖关系。对于ROS初学者,或者小型项目,使用catkin_make足够。 - **catkin build**:适用于较大的工作空间,包含多个相互依赖的包,或者需要并行构建以加快速度。它提供了更灵活和强大的构建管理,尤其适合持续集成(CI)和大型项目开发。 4. **迁移**: - 从catkin_make迁移到catkin build很简单,只需要在工作空间根目录运行`catkin init`(初始化工作空间,会创建一个隐藏的`.catkin_tools`目录)[^5]。 - 然后就可以使用`catkin build`命令构建整个工作空间。 5. **命令对比**: - 构建整个工作空间: - catkin_make: `catkin_make` - catkin build: `catkin build` - 构建特定包: - catkin_make: `catkin_make --pkg <package_name>` - catkin build: `catkin build <package_name>` - 清理构建: - catkin_make: 需要手动删除`build`和`devel`目录(或者使用`catkin_make clean`,但只能清理上次构建的产物,不够彻底) - catkin build: `catkin clean`(可以彻底清理整个工作空间的构建产物,也可以清理指定包) 6. **性能**: - catkin build在并行构建时(使用`-j`选项)可以显著加快构建速度,特别是对于多核处理器。 **总结建议**: - 对于新项目,尤其是中大型项目,推荐使用catkin build。 - 对于已有项目,如果使用catkin_make遇到依赖问题或需要更灵活的构建控制,可以迁移到catkin build。 §§相关问题§§ 1. 如何安装catkin_tools工具包? 2. 使用catkin build时如何指定构建特定包? 3. 如何清理catkin build构建的产物? 4. catkin build支持哪些高级功能(如配置文件、构建类型等)?</think>### ROS中`catkin build`与`catkin_make`的区别及使用场景 #### 一、核心区别 | **特性** | **catkin_make** | **catkin build** | |------------------------|-------------------------------------|--------------------------------------| | **构建逻辑** | 统一构建整个工作空间 | 独立编译每个包(隔离构建)[^3] | | **依赖处理** | 可能因包依赖顺序出错 | 自动解析依赖顺序,可靠性更高[^2] | | **构建目录** | 统一`build/`和`devel/`目录 | 为每个包创建独立构建空间[^5] | | **命令功能** | 基础构建命令 | 提供`list/clean/config`等高级工具[^5]| | **并行编译** | 不支持 | 支持`-j`参数并行编译[^3] | | **环境感知** | 需在workspace根目录运行 | 支持子目录操作(自动识别workspace)[^5]| #### 二、工作流程对比 **1. catkin_make流程** ```bash cd ~/catkin_ws catkin_make # 构建整个工作空间 source devel/setup.bash ``` **2. catkin build流程** ```bash cd ~/catkin_ws catkin init # 初始化工作空间[^5] catkin build pkg_a # 构建特定包 source install/setup.bash ``` #### 三、使用场景建议 | **工具** | **推荐场景** | |-------------------|-----------------------------------------------------------------------------| | **catkin_make** | - 小型工作空间(<5个包)<br>- ROS初学者快速上手<br>- 简单项目调试 | | **catkin build** | - 大型项目(>10个包)[^2]<br>- 包间存在复杂依赖<br>- 持续集成(CI)环境[^2]<br>- 需要增量编译或选择性编译 | #### 四、典型问题解决 1. **迁移问题**: 出现`catkin: command not found`时需安装工具包: ```bash sudo apt install python3-catkin-tools # 安装catkin build[^4] ``` 2. **构建失败处理**: ```bash catkin clean # 彻底清理构建产物(优于catkin_make clean)[^3] catkin build -j8 --no-status # 并行编译并简化输出 ``` > **关键建议**:新项目优先使用`catkin build`,尤其在涉及PX4/MAVROS等复杂系统时,其依赖处理能力可避免`Failsafe`等错误[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值