cmake使用记录

3 阅读2分钟

一、add_executable

作用:创建可执行程序

add_executable(app main.cpp)

意思是:

生成一个可执行文件 app
使用 main.cpp 编译

例如:

add_executable(MyApp
    main.cpp
    window.cpp
)

二、add_library

作用:创建库

add_library(math math.cpp)

默认生成:

静态库

Linux:

libmath.a

可以指定类型

静态库:

add_library(math STATIC math.cpp)

动态库:

add_library(math SHARED math.cpp)

仅接口库(header only):

add_library(utils INTERFACE)

三、include_directories

作用:添加头文件搜索路径

旧写法:

include_directories(include)

等价于:

g++ -Iinclude

例如:

目录:

project
 ├── include
 │    └── math.h
 └── main.cpp

代码:

#include "math.h"

就需要:

include_directories(include)

现代写法(推荐)

target_include_directories(app PRIVATE include)

区别:

写法作用
include_directories全局
target_include_directories只作用某个target

四、link_directories

作用:添加库文件搜索路径

旧写法:

link_directories(lib)

等价于:

g++ -Llib

如果:

lib/libmath.so

你就可以:

target_link_libraries(app math)

现代写法(基本不用)

推荐直接:

target_link_libraries(app /path/libmath.so)

或者:

find_package()

所以:

link_directories 已经不推荐使用

五、add_definitions

作用:添加宏定义

例如:

add_definitions(-DDEBUG)

等价于:

g++ -DDEBUG

代码:

#ifdef DEBUG
printf("debug\n");
#endif

现代写法

target_compile_definitions(app PRIVATE DEBUG)

六、target_link_libraries(最重要)

这个命令 90% 的 CMake 工程都会用

作用:

链接库

例如:

target_link_libraries(app math)

等价:

g++ main.cpp -lmath

现代写法:

target_link_libraries(app PRIVATE math)

三种关键字:

关键字作用
PRIVATE只当前target
PUBLIC当前 + 依赖者
INTERFACE只依赖者

七、target_compile_options

作用:添加编译参数

例如:

target_compile_options(app PRIVATE -Wall)

等价:

g++ -Wall

八、target_compile_features

设置 C++ 标准:

target_compile_features(app PRIVATE cxx_std_17)

或者:

set(CMAKE_CXX_STANDARD 17)

九、add_subdirectory

作用:引入子目录 CMake

例如:

project
 ├── src
 ├── lib
 └── CMakeLists.txt

主 CMake:

add_subdirectory(lib)
add_subdirectory(src)

十、find_package

作用:查找第三方库

例如 Qt:

find_package(Qt6 REQUIRED COMPONENTS Widgets)

然后:

target_link_libraries(app Qt6::Widgets)

十一、file

操作文件:

file(GLOB SRC *.cpp)

然后:

add_executable(app ${SRC})

不过:

⚠️ 大型工程不推荐 GLOB


十二、总结一下常见命令

最核心的一些:

命令作用
project定义工程
add_executable生成程序
add_library生成库
target_link_libraries链接库
target_include_directories头文件
target_compile_definitions
target_compile_options编译参数
add_subdirectory子模块
find_package第三方库

十三、现代 CMake 推荐写法

你以后最好写成这样:

cmake_minimum_required(VERSION 3.16)

project(MyProject)

add_library(math math.cpp)

target_include_directories(math
    PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}
)

add_executable(app main.cpp)

target_link_libraries(app
    PRIVATE
        math
)

特点:

所有配置都绑定到 target