欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ethz-asl的catkin simple

程序员文章站 2022-07-15 16:44:29
...

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,只会编译在msgsrvaction文件夹中的消息。当然,编译的前提是 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

相关标签: Cmake