【CMake】掌握CMake基本操作
@TOC
1.文件树和CMakeLists.txt一览
文件树
CMakeLists.txt
1.1 语法基本规则
变量在使用时加${},但在IF控制语句中不加(基本也用不到)
参数与参数之间用 " ; " 或者 " " 分隔
指令不区分大小写,参数和变量区分大小写
1.2 文件目录讲解
cmake-build-debug目录:用来执行编译和安装
cmake目录:用来CMakeLists.txt的配置文件
doc目录:用来存放说明文档
lib目录:用来存放库文件
LICENSE文件:用来存放版权信息
main.cpp:用来存放程序的入口
README.md:用来存放基本项目说明
run.sh:一键调用的脚本文件
settings.zip:用来存放一些配置文件
2.基本指令讲解
2.1 CMAKE_MINIMUM_REQUIRED(VERSION XXX)
指定最低版本要求
2.2 PROJECT(projectname)
参数一:生成工程的名字
可选参数二:使用的编程语言。可以不指定编程语言,自动识别(recommended)
2.3 SET()
set()
指令可以创建一个变量并赋值,此处SET(CMAKE_CXX_STANDARD 17)
表示设置CMAKE_CXX_STANDARD
这个变量为17
,即设置C++标准为17。
2.4 ADD_SUBDIRECTORY(src bin)
在./src/目录下寻找并链接下一个CMakeLists.txt,然后在编译目录下,即cmake-build-debug目录下生成一个bin目录,并且在bin目录下执行下这个子CMakeLists.txt里面的语句
参数一:包含子CMakeLists.txt的目录
可选参数二:为子CMakeLists.txt创建一个指定名字的目录去执行,若不给出此参数,则自动在cmake-build-debug目录下执行子CMakeLists.txt的语句
2.5 INCLUDE_DIRECTORIES(lib/)
添加头文件搜索的路径./lib
在Linux系统中,默认的头文件搜索路径是/usr/include和/usr/local/include
2.6 ADD_EXECUTABLE(main main.cpp)
将main.cpp文件生成可执行文件
参数一:生成的可执行文件的名字
参数二:含main函数的一个或者多个文件名
INCLUDE_DIRECTORIES指令要放在ADD_EXECUTABLE的前面
TARGET_LINK_LIBRARIES指令要放在ADD_EXECUTABLE的后面
2.7 ADD_LIBRARY(参数一 参数二(STATIC/SHARED) 参数二)
打包一些源代码生成一个库文件
参数一:生成的库文件的名字
参数二:可选STATIC或者SHARED,表示生成的是静态库或者动态库
参数三:一个或者多个源代码文件
2.8 TARGET_LINK_LIBRARIES(参数一;参数二)
链接某个库到可执行文件
参数一:使用ADD_EXECUTABLE
生成的可执行文件的名字
参数二:库文件的路径
在Linux系统中,默认的库文件搜索路径是/usr/lib
2.9 FIND_PACKAGE()
在使用第三方库时,常常使用此指令来找到第三方的库,如:
此指令会自动在/usr/lib/cmake
、/usr/share/cmake
、/usr/lib/x86_64-linux-gnu/cmake
、/snap/cmake
等等这样的安装路径去寻找类似于XXConfig.cmake
这样的配置文件。
如果是自行下载的库,没有进行安装的话,只需要添加指令:
这样就增加了cmake寻找库的路径。
3.构建和安装同名静态库和动态库
3.1 静态库和动态库的区别
静态库拓展名为" .a " 和 " .lib " ,动态库拓展名为" .so " 和 " .dll "
静态库在编译时会整合到目标可执行文件中,生成的可执行文件可以独立运行
动态库在编译时不会整合到目标可执行文件中,生成的可执行文件不可以独立运行
3.2 构建指令
3.2.1 ADD_LIBRARY
将变量LIB_LIST生成静态库文件libprojectname_static.so
将变量LIB_LIST生成动态态库文件libprojectname_shared.h
参数一:生成的库文件名
参数二:静态库(STATIC)或动态库(SHARED)
参数三:源代码文件或变量
在CMake的机制中,以上两条指令被认为是构建了同名的库,如果不进行属性设置,那么在编译时会自动进行覆盖
3.2.2 SET_TARGET_PROPERTIES
将两个库文件名都重命名为 " projectname ",并且指定输出时不清除同名文件
参数一:输出文件的名字
参数二:PROPERTIES,表示设置属性
参数OUTPUT_NAME:重命名
参数CLEAN_DIRECT_OUTPUT:输出形式
除此之外,还有很多参数可以选择
3.3 安装指令
3.3.1 INSTALL()
将文件projectname.h、authority.h、projectname_static、projectname_shared安装到指定位置
参数一:要安装的文件类型
参数二:要安装的文件名字
参数DESTINATION:安装路径
参数LIBRARY DESTINATION:动态库安装路径
参数ARCHIVE DESTINATION:静态库安装路径
3.3.2 安装文件类型与关键字对应关系
TARGETS
库文件、头文件
FILES
一般文件
PROGRAMS
脚本文件
DIRECTORY
文本文件
Last updated