CMakeLists.txt基本语法及使用

1、cmake的说明

cmake是一种高级编译配置工具
当多个人用不同的语言或者编译器开发一个项目,最终要输出一个可执行文件或者共享库(dll,so等等)这时候便需要用到cmake。
CMakeList.txt中指令不区分大小写。
CMakeList.txt中的参数和变量是区分大小写,名称只能用字母,数字,下划线,破折号。
学习CMake,有助于我们与他们协同开发大型c/c++/java项目。
 

2、cmake安装

sudo apt intall cmake
安装完成之后可以通过
cmake --version
来检查你电脑上所安装的cmake版本
 

3、cmake的使用

安装完成后,我们简单写一个main.cpp
#include <iostream>
using namespace std;
int main()
{
    cout << "hello world!" << endl;
    return 0;
}
编写编译所需要的CMakeLists.txt文件
PROJECT(HELLO)
SET(SRC_LIST main.cpp)
MESSAGE(STATUS "this is binary dir" ${HELLO_BINARY_DIR})
MESSAGE(STATUS "this is source dir" ${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
编译得到的全部文件:
0
编译时所看到的编译Log打印如下:
0
 

4、cmake的语法

1)CMAKE_MINIMUM_REQUIRED关键字
CMAKE_MINIMUM_REQUIRED(VERSION 2.6) // 指定限定的最小的cmake版本,可省略
 
2)PROJECT关键字
PROJECT(HELLO) // 指定工程的名字,并且支持所有语言
PROJECT(HELLO CXX) // 指定工程的名字为HELLO,并且支持的语言是c++
PROJECT(HELLO C CXX) // 指定工程的名字为HELLO,并且支持的语言是c和c++
该指定隐式定义了两个CMAKE变量
_BINARY_DIR,本例中是HELLO_BINARY_DIR
_SOURCE_DIR,本例中是HELLO_SOURCE_DIR
MESSAGE关键字可以直接使用这两个变量,都指向当前的工作目录
 
3)SET关键字
用来显示的指定变量的
SET(SRC_LIST main.cpp) // SRC_LIST变量中就包括了main.cpp
也可以包含多个文件,例如:SET(SRC_LIST main.cpp test1.cpp test2.cpp)
 
4)MESSAGE关键字
向终端输出用户自定义信息
主要包含三种信息:
SEND_ERROR,产生错误,生成过程被跳过
STATUS,输出前缀为--的信息
FATAL_ERROR,立即终止所有cmake过程
 
5)ADD_EXECUTABLE关键字
生成可执行文件
ADD_EXECUTABLE(hello ${SRC_LIST}) 生成的可执行文件名为hello,源文件读取变量SRC_LIST中的内容
也可以直接写成 ADD_EXECUTABLE(hello main.cpp)
工程名的HELLO和生成的可执行文件hello没有任何关系
 
6)ADD_SUBDIRECTORY指令
例如:ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
该指令用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置
EXCLUDE_FROM_ALL函数是将写的目录从编译中排除
例如:ADD_SUBDIRECTORY(src bin)
将src子目录加入工程并指定编译输出(包含编译中间文件)路径为bin目录
 
7)ADD_LIBRARY关键字
ADD_LIBRARY默认生成是静态库
ADD_LIBRARY(common STATIC test.cpp) // 生成静态库
ADD_LIBRARY(common SHARED test.cpp) // 生成动态库或共享库
 
8)FIND_PACKAGE
查找指定的预编译包
例如:find_package(OpenCV 4.1 REQUIRED) // 查找opencv 4.1 安装路径
相似的指令还有 find_file()、find_path()、find_program()、find_library()
 
9)INCLUDE_DIRECTORIES
加载编译所需要的文件
例如:include_directories(OpenCV_INCLUDE_DIRS) // 加载opencv 4.1的头文件
 
10)TARGET_LINK_LIBRARIES
链接文件到目标文件中
 

5、内部构建和外部构建

由于cmake产生的文件太多,所以我们可以使用外部构建方法,如下:
0
这种的方式会将编译生成的中间文件和生成产物放在build目录下,源文件还在cmake目录下。做到分类清晰。
 

6、工程使用

添加外部CMakeLists.txt文件
0
编译生成的所有文件如下:
0
可以看到,在src目录下放置的是源文件,在build/bin目录下放置的是hello可执行文件
 
posted @ 2024-03-19 12:57  lethe1203  阅读(270)  评论(0编辑  收藏  举报