catkin_simple可以让其他catkin工程更方便。
CMakeLists.txt Example
下面是一个名为foo的catkin工程的例子
cmake_minimum_required(VERSION 2.8.3)
project(foo)
find_package(catkin_simple REQUIRED)
catkin_simple()
cs_add_library(my_lib src/my_lib.cpp)
cs_add_executable(my_exec src/main.cpp)
target_link_libraries(my_exec my_lib)
cs_install()
cs_install_scripts(scripts/my_script.py)
cs_export()
下面一行一行的解释每句语句。
前面几行是标准的CMake必备语句
cmake_minimum_required(VERSION 2.8.3)
project(foo)
声明工程所需CMake最低版本,声明工程的名字。
下面是寻找依赖的其他catkin工程
find_package(catkin_simple REQUIRED)
和其他的 find_package 功能一样,没有什么特别的。
catkin_simple()
之后调用 catkin_simple
catkin_simple()
这句宏从当前package的package.xml收集build_depend,之后每一项执行find_package(...)操作(each with the QUIET option and without the REQUIRES option).如果某些build_depend不是catkin的package就忽略了。如果当前package依赖一些不存在的catkin的package,catkin_simple会报warning。
然后,这句宏会执行 include_directories(...),如果当前package有include,也会包含进去。
最后,这句宏也会编译ROS的messages、services、actions,只会编译在msg、srv、action文件夹中的消息。当然,编译的前提是 build_depend 中有message_generation,并且run_depend 中没有message_runtime.
cs_add_library()
接下来会生成库
cs_add_library(my_lib src/my_lib.cpp)
这句调用会执行CMake的宏 add_library,之后会调用target_link_libraries(my_lib ${catkin_LIBRARIES})来链接这个library所需要的库。
最后还做了一些工作,方便之后implicitly调用。
cs_add_executable()
之后加了一个可执行文件
cs_add_executable(my_exec src/main.cpp)
target_link_libraries(my_exec my_lib)
这个和上面的cs_add_library差不多,只不过这里调用的CMake宏是add_executable(...)。
这里显示地(explicitly)调用了target_link_libraries用来链接库的依赖,是因为无法强制目标的创建顺序。
这个可执行文件依旧会自动地链接catkin libraries
cs_install()
cs_install()
cs_install_scripts(scripts/my_script.py)
第一句宏会install所有以cs_为前缀的库和可执行文件。
这句宏也会install其他你需要的可执行文件(虽然前缀不是cs_)。看源文件好像是会去找 *.h *.hpp 文件。
这句宏可写可不写。
第二句宏为install指定脚本,路径为${prefix}/lib/${pkg_name}/
cs_export()
最后 export everything
cs_export()
这句宏调用catkin_package(...),之后用catkin_simple就可以自动找寻当前package的libraries。也可以在调用这句宏的同时输入自己需要的参数,最后也会被catkin_package(...) 调用。这句宏一定要写。
catkin_simple存在的缺点
catkin_simple 存在几个已知的缺点(权衡便利之后的结果)
find_package如果not found ,没有warning- 存在过度链接,因为所有依赖关系、所有库都不加选择地与所有目标链接。
include文件夹格式必须是project/include/project/...- 如果添加了新的
.msg或.srv文件,只有强制重新执行Cmake,才会检测到 - 所有目标都对任何下游消息生成具有目标依赖性,这导致目标的次优并行化,因为存在不必要的依赖性。(All targets have a target dependency on any downstream message generation, which results in sub-optimal parallelization of targets, as there are unnecessary dependencies created.)
参考
https://github.com/ethz-asl/kalibr/tree/master/catkin_simple
catkin_simple是一个方便的工具,用于简化catkin工程的CMake配置。它自动处理库和可执行文件的添加,安装以及导出。通过cs_add_library和cs_add_executable,可以轻松创建和链接库及执行文件。尽管存在如过度链接和需要手动触发CMake检测新文件等缺点,但catkin_simple仍能提高catkin项目的构建效率。

5528

被折叠的 条评论
为什么被折叠?



