ROS——CMakeLists.txt总结

1. Package name

project(robot_brain)

项目名需与package名一致。

2. Finding Dependent CMake Packages

find_package(catkin REQUIRED COMPONENTS nodelet)

利用find_package()语法,将此package所依赖的其他package,以components形式find进来,作为catkin的组件。

  • find_package所做的事

    如果一个package被find到了,CMake会定义几个环境变量,供引用,命名格式与内容如下

    • <NAME>_FOUND - Set to true if the library is found, otherwise false

    • <NAME>INCLUDE_DIRS or <NAME>INCLUDES - The include paths exported by the package

    • <NAME>LIBRARIES or <NAME>LIBS - The libraries exported by the package

    • <NAME>_DEFINITIONS - ?

  • 将其他package以components形式find进来的原因

    将package作为catkin组件find进来时,除了定义上面那些常规环境变量,还将定义catkin的一些环境变量,例如 catkin_INCLUDE_DIRS

3. catkin_package()

被用来指定一些catkin特定的信息,拥有五个参数

  • INCLUDE_DIRS - The exported include paths (i.e. cflags) for the package

    此参数用来指定外部依赖此package时头文件的路径

  • LIBRARIES - The exported libraries from the project

    此参数用来指定外部依赖此package时链接库的路径

  • CATKIN_DEPENDS - Other catkin projects that this project depends on

    此package依赖的其他package(属于catkin)

  • DEPENDS - Non-catkin CMake projects that this project depends on.

    此package依赖的其他package(不属于catkin,例如我们自己编译安装的opencv就可以用DEPENDS来修饰)

  • CFG_EXTRAS - Additional configuration options

    暂时不清楚

以下类似报错常常由catkin_package错误设置或没设置引起

  • fatal error: show/show.hpp: 没有那个文件或目录

    被依赖的库的catkin_package没有设置INCLUDE_DIRS,或者设的和引用的不一样,总之检查此参数即可

  • 对cv::waitKey(int)未定义的引用

    没有链接上被依赖package的动态/静态库,或是没有链接上被间接依赖的package的动态/静态库。

    检查对应被依赖package所add_library()生成的库名称,检查依赖package有没有target_lick_libraries()对应库(比如这里就是没有链接opencv库)

    一般不用设置LIBRARIES .

     

4. Specifying Build Targets

  • Include Paths

    find_package()后,应有*_INCLUDE_DIRS这个指代头文件目录的环境变量,利用它将所有头文件目录加进去。

    include_directories(include ${catkin_INCLUDE_DIRS})

    The first argument "include" indicates that the include/ directory within the package is also part of the path.

  • Library Paths

    find_package()后,所有catkin和CMake都将自动添加各自的link信息。只需用target_link_libraries即可简单的进行添加

    link_directories(~/my_libs)

    也可用ling_directories()添加link的目录(此处有疑问)

  • Executable Targets

    对于需要生成的可执行文件,必须使用以下指令来生成

    add_executable(myProgram src/main.cpp src/some_file.cpp src/another_file.cpp)

    会生成一个名叫 myProgram 的可执行文件

  • Library Targets

    使用下面的指令生成链接库文件(catkin生成动态库)

    add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SRCS})

     

  • target_link_libraries

    使用此指令,将可执行文件需要链接的库文件链接上去。注意点:必须在add_executable后面再使用。

    add_executable(foo src/foo.cpp)
    add_library(moo src/moo.cpp)
    target_link_libraries(foo moo)  -- This links foo against libmoo

    有些情况下可以使用${catkin_LIBRARIES} (此处有疑问)

    一个注意点:大多数情况下,我们不需要事先执行link_directories来为链接库指定路径,因为它一般都会在find_package()时就被定义好了,我们直接target_link_libraries就好。

 

 

### 如何定位项目的根级 CMakeLists.txt 文件 为了找到项目中的最外层 `CMakeLists.txt` 文件,可以利用其定义的特点来判断。通常情况下,根级别的 `CMakeLists.txt` 是整个项目的入口文件,它会包含一些特定的关键字和配置项。 #### 判断依据 1. **PROJECT_SOURCE_DIR 定义** 根据说明,`PROJECT_SOURCE_DIR` 表示的是当前项目的根目录,即包含顶层 `CMakeLists.txt` 文件的位置[^2]。因此,可以通过查找设置此变量的上下文来确认该文件是否位于项目的根级别。 2. **catkin 项目特性** 对于基于 Catkin 的 ROS 项目而言,根级 `CMakeLists.txt` 文件通常是用来初始化整个工作空间的核心文件之一。这类文件一般不会调用其他子模块的构建逻辑,而是专注于整体结构声明[^1]。 3. **递归搜索方法** 如果不确定具体位置,则可以在命令行工具中执行如下操作以自动发现目标: ```bash find /path/to/project -name "CMakeLists.txt" ``` 上述脚本能够遍历指定路径下的所有子目录并返回匹配名称的结果列表。通过观察输出结果集里哪一个是最高层次的存在即可判定为目标对象。 另外,在某些IDE环境(如CLion或者VSCode),也内置有插件支持快速跳转至对应build script所在处;只需简单右键点击工程树节点选择相应选项便可完成导航动作而无需手动排查每一个可能候选者。 --- ### 提供一段Python辅助代码实现自动化检测功能 下面给出了一段简单的 Python 脚本来帮助识别给定路径内的顶级 cmake 配置文档地址: ```python import os def find_top_level_cmakelists(start_path): top_cmake = None min_depth = float('inf') for root, dirs, files in os.walk(start_path): depth = root[len(start_path)+len(os.sep):].count(os.sep) if 'CMakeLists.txt' in files and depth < min_depth: top_cmake = os.path.join(root, 'CMakeLists.txt') min_depth = depth return top_cmake project_root = "/your/project/path" # 替换为实际项目路径 top_cmakelist = find_top_level_cmakelists(project_root) if top_cmakelist: print(f"The top-level CMakeLists.txt is located at:\n{top_cmakelist}") else: print("No CMakeLists.txt found.") ``` 以上程序片段采用广度优先策略扫描传入参数所指代区域内部各层级内容直至捕获首个符合条件实例为止——即距离起始点最近的那个cmake descriptor instance. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值