cmakelist.txt编写总结

7 篇文章 16 订阅
2 篇文章 0 订阅

简述

前期进行autoware.auto中泊车代码移植,考虑到auto基于ros2编写,而代码使用环境为ros1,需要进行cmakelist的重写:难点为ros2编译指令向ros1迁移,autoware自身编译选项的破解及指令重写。故对cmakelist.txt的指令进行总结。

指令集合

cmake指令依据CMakeLists.txt 文件生成makefiles文件,make命令再依据makefiles文件编译链接生成可执行文件

cmake_minimum_required(VERSION 3.5)
1、表明Cmake所需要的最低版本:仅针对本项目

project(cmake_template)
2、软件包名字,可以通过使用变量 ${PROJECT_NAME}在CMake脚本后面的任何位置引用项目名称,引入PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR两个变量

message(“start make cmake_template”)
3、message()打印消息

find_package()
4、find_package函数确定依赖的其他CMake包并找到它们,查找到一个软件包,它就会创建几个CMake环境变量,以提供有关已查找到的软件包的信息。环境变量可以在后面的CMake脚本中使用,它们表示软件包导出的头文件所在的位置、源文件所在的位置、软件包依赖的库以及这些库的查找路径,环境变量的名字遵循 _,即包名-属性
#_FOUND:当库被查找到时置为true,否则为false
#_INCLUDE_DIRS或_INCLUDES:软件包导出的头文件路径
#_LIBRARIES或_LIBS:软件包导出的库的路径
#如果使用C++和Boost库,需要在Boost上调用 find_package(),并指定Boost中将要作为组件的那部分[regex thread system filesystem]
find_package(Boost REQUIRED COMPONENTS regex thread system filesystem)
find_package(catkin REQUIRED COMPONENTS nodelet)

注意:nodelet导出的头文件路径、库等都会附加到 catkin_variables上,比如,catkin_INCLUDE_DIRS不仅包含catkin的头文件路径,也包含了nodelet软件包的头文件路径

catkin_package()
5、catkin_package()指定特定的catkin信息到编译系统,而这些信息又会被用于生成pkg-config和CMake文件。
该函数必须在使用 add_library()或add_executable()声明任何targets之前调用。其5个可选参数:
INCLUDE_DIRS:软件包导出的头文件路径[通常是include]
LIBRARIES:项目导出的库[可以取${PROJECT_NAME}]
CATKIN_DEPENDS:当前项目依赖的其他catkin项目【】
DEPENDS:当前项目依赖的非catkin CMake项目【编译/运行此程序包时需要存在的系统依赖项,eigen opencv等】
CFG_EXTRAS:其他的配置选项

注意:find_package()查找此程序包的依赖项。
catkin_package(CATKIN_DEPENDS)声明依赖于此程序包的程序包的依赖关系。

编译目标
6、编译目标可以采取多种形式,但通常它们代表两种可能性之一:
1)可执行目标:可以运行的程序
2)库目标:在编译和/或运行时可以由可执行目标使用的库
6.1、目标命名:set_target_properties()函数对目标重命名,不管编译/安装到哪个文件夹中,编译目标在catkin中的名称都必须是唯一的
6.2、自定义输出目录:可执行文件和库的默认输出目录通常设置为合理的值,通过set_target_properties()进行自定义输出目录设置
6.3、在指定目标之前,需要指定生成所述目标的头文件和库位置:
6.3.1、头文件目录:将要编译的代码(C/C++)所需的头文件路径
include_directories的参数应该是由调用find_package生成的* _INCLUDE_DIRS变量以及需要包含的任何其他目录
include_directories(include {Boost_INCLUDE_DIRS} {catkin_INCLUDE_DIRS})
第一个参数“include”表示包中的include/目录也是路径的一部分。、
也可以set(CMAKE_CXX_FLAGS " ${CMAKE_CXX_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}")
通过set设置编译选项【set命令设置CMAKE_CXX_FLAGS变量则是c++编译器的】
6.3.2、库目录:可执行目标编译所需的库路径。link_directories()函数可以添加其他的库目录【不推荐使用】
6.4、可执行目标:指定编译的可执行目标,必须使用CMake函数add_executable()。
声明可执行文件的文件名 生成此可执行文件所需的源文件列表,如果有多个源文件,用空格区分开
add_executable(myProgram src/main.cpp src/some_file.cpp src/another_file.cpp)
myProgram的可执行文件,它是由后面的三个源文件共同编译生成
6.5 库目标:add_library()指定编译的库目标,默认情况下,catkin编译共享库
add_library({PROJECT_NAME} {${PROJECT_NAME}_SRCS})
6.6 target_link_libraries函数指定可执行目标链接的库【这些库在上面的find_package中定义】,通常在调用完add_executable()后被调用。
target_link_libraries(, , , … )

7、变量设置:
7.1、set 直接设置变量的值。如:set(SRC_LIST main.cpp test.cpp)
7.2、set 追加设置变量的值
7.3、list 追加或者删除变量的值 set(SRC_LIST main.cpp);list(APPEND SRC_LIST test.cpp);list(REMOVE_ITEM SRC_LIST main.cpp)

8、消息、服务和操作目标
被ROS软件包编译和使用之前,ROS中的消息(.msg)、服务(.srv)和操作(.action)文件需要特殊的预处理器编译步骤
宏的要点是生成编程语言特定的文件,以便可以在编程语言中使用消息、服务和操作。

aux_source_directory(dir VAR) 发现一个目录下所有的源代码文件并将列表存储在一个变量中
add_definitions()函数控制代码的开启和关闭,以D或者-D开始,通常与option()进行配合使用
add_subdirectory添加一个子目录并构建该子目录。例子:add_subdirectory (source_dir [binary_dir] [EXCLUDE_FROM_ALL]),生成.a文件
说明:source_dir必选参数。该参数指定一个子目录,子目录下应该包含CMakeLists.txt文件和代码文件
binary_dir可选参数。该参数指定一个目录,用于存放输出文件
EXCLUDE_FROM_ALL可选参数。当指定了该参数,则子目录下的目标不会被父目录下的目标文件包含进去,父目录的CMakeLists.txt不会构建子目录的目标文件,必须在子目录下显式去构建
configure_file将文件复制到另一个位置并修改其内容。输入文件以.h.in为后缀,输出文件以.h为后缀。通常在cmakelist.txt中与set配合使用。例子:configure_file(<input> <output>[COPYONLY] [ESCAPE_QUOTES] [@ONLY][NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
说明:configure_file,复制一份输入文件到输出文件,替换输入文件中被@VAR@或者${VAR}引用的变量值。
target_include_directories():指定目标包含的头文件路径。通常完全可以由include_directories取代,例子:target_include_directories(<target>[SYSTEM][BEFORE]<INTERFACE|PUBLIC|PRIVATE>[items1...] [<INTERFACE|PUBLIC|PRIVATE>[items2...]...]>)
说明:target目标文件必须已经存在;关键字INTERFACE,PUBLIC和PRIVATE指定它后面参数的作用域。
add_dependencies()解决依赖关系,由于依赖关系的存在,所以被依赖的项目总是最先构建。例子:(<target> [<target-dependency>]...)
说明:目标是由add_executable()、add_library()或add_custom_target()命令创建的
include()指令用来载入并运行来自于文件或模块的 CMake 代码

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值