CMakeLists文件规划学习
发布日期:2022-02-06 00:27:06 浏览次数:14 分类:技术文章

本文共 2473 字,大约阅读时间需要 8 分钟。

CMakeLists文件规划学习

在学习他人代码的过程中了解到一些CMakeLists的使用技巧,所以进行一个简单总结

1. 把各个包放在单独的cmake文件中

调用一个包,就是常规的三个步骤:find_package,include_directions,target_link_libraries

包多的时候代码太杂,所以我们需要把每个包对应的这些操作放在cmake文件夹下对应的XX.cmake文件中,然后在CMakeLists中include(cmake/XX.cmake)一行代码就可以搞定。

2. 合并变量

为了避免target_link_libraries后面跟着很长一串库的名字,而且库增减的时候也要跟着增减,我们在CMakeLists文件开始就定义一个变量

set(ALL_TARGET_LIBRARIES "")

然后在每个库对应的XX.cmake文件中,把库的名字合并到这个变量中去

list(APPEND ALL_TARGET_LIBRARIES ${XX_LIBRARIES})

这样在target_link_libraries中只需要使用ALL_TARGET_LIBRARIES这一个变量就可以了

除了库对应的变量,还有文件对应的变量,我们在add_executable的时候要把所需要的cpp文件路径都写进去,文件多的时候较麻烦,所有可以使用下面的指令,把所有cpp文件合并到一个变量中

file(GLOB_RECURSE ALL_SRCS "*.cpp")

但是,当工程中有多个node文件的时候,就要把他们从这个变量中踢出去,因为多个node文件编到一个可执行文件会出错,用下面的代码踢:

file(GLOB_RECURSE NODE_SRCS "src/*_node.cpp")list(REMOVE_ITEM ALL_SRCS ${NODE_SRCS})

3. 示例

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)project(lidar_localization)SET(CMAKE_BUILD_TYPE "Release")SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")add_compile_options(-std=c++11)add_definitions(-std=c++11)find_package(catkin REQUIRED COMPONENTS  roscpp  rospy  std_msgs  pcl_ros  geometry_msgs  tf  eigen_conversions  message_generation   std_srvs)add_service_files(   FILES   optimizeMap.srv)generate_messages(   DEPENDENCIES   std_msgs)#设置一个变量 ALL_TARGET_LIBRARIES 然后在各个.cmake文件中,把库的名字合并到这个变find_package量中去set(ALL_TARGET_LIBRARIES "")   #使用include来包含PCL.cmake中的一些操作,相关内容在后面展示include(cmake/PCL.cmake)include_directories(include ${catkin_INCLUDE_DIRS})catkin_package()#把当前的.cpp文件都合并到变量ALL_SRCS中去 ,后面add_executable时就不需要把所有cpp文件路径都写入了file(GLOB_RECURSE ALL_SRCS "*.cpp")#把所有_node.cpp文件都合并到变量NODE_SRCS中,用于后面踢除file(GLOB_RECURSE NODE_SRCS "src/apps/*_node.cpp")#在所有的.cpp文件中踢除_node.cpp文件list(REMOVE_ITEM ALL_SRCS ${NODE_SRCS})#现在可以直接使用我们前面定义的变量ALL_SRCSadd_executable(test_frame_node src/apps/test_frame_node.cpp ${ALL_SRCS})#使用我们前面定义的变量ALL_TARGET_LIBRARIEStarget_link_libraries(test_frame_node ${catkin_LIBRARIES} ${ALL_TARGET_LIBRARIES})add_executable(data_pretreat_node src/apps/data_pretreat_node.cpp ${ALL_SRCS})add_dependencies(data_pretreat_node ${catkin_EXPORTED_TARGETS})target_link_libraries(data_pretreat_node ${catkin_LIBRARIES} ${ALL_TARGET_LIBRARIES})

cmake/PCL.cmake

find_package(PCL 1.7 REQUIRED)list(REMOVE_ITEM PCL_LIBRARIES "vtkproj4")include_directories(${PCL_INCLUDE_DIRS})#每个库所对应的.cmake文件中,把每个库的名字合并到ALL_TARGET_LIBRARIES这个变量上去list(APPEND ALL_TARGET_LIBRARIES ${PCL_LIBRARIES})

参考链接:

https://zhuanlan.zhihu.com/p/105512661

文档中若有错误请指出,万分感谢!

转载地址:https://blog.csdn.net/weixin_46181372/article/details/112677855 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:导航栏代码例子及注意事项
下一篇:GLog学习记录

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.191.171.40]2022年10月02日 16时40分04秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章

Struts2 XML配置详解 2019-12-23 00:55:00
Js获取当前日期时间及其它操作 2019-12-23 00:55:00
ssh 登陆 2019-12-23 00:54:58
转载 Hibernate的generator属性之意义 2019-12-23 00:54:58
hibernate的cascade属性 2019-12-23 00:54:58
actionForm详解 2019-12-23 00:54:58
第一部分:Hibernate入门 2019-12-23 00:54:58
第二部分:Hibernate的基本配置 2019-12-23 00:54:59
第三部分:Hibernate的基本开发 2019-12-23 00:54:59
数据结构 2019-12-23 00:54:56
pac配置 2019-12-23 00:54:57
计算机视觉和图像识别简介 2019-12-23 00:54:57
ubuntu卸载python3 2019-12-23 00:54:57
ubuntu 寻找与定位 2019-12-23 00:54:57
ubuntu pycharm环境 2019-12-23 00:54:57
git命令 2019-12-23 00:54:57
anaconda下载安装 2019-12-23 00:54:55
anaconda配置 2019-12-23 00:54:55
树莓派配置 2019-12-23 00:54:55
pytorch使用 2019-12-23 00:54:56