ethz-asl的catkin simple
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
上一篇: CMake学习记录
推荐阅读
-
在Python的Django框架中simple-todo工具的简单使用
-
在 Vue-CLI 中引入 simple-mock实现简易的 API Mock 接口数据模拟
-
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
-
PHP解析html类库simple_html_dom的转码bug
-
Vue上传组件vue Simple Uploader的用法示例
-
Godaddy VDS Simple Control Panel出错的解决方法
-
Dubbo监控中心搭建-dubbo-monitor-simple的使用
-
ethz-asl的catkin simple
-
bootstrap + simple_form 的 check_boxes inline样式
-
bootstrap + simple_form 的 check_boxes inline样式