CMake的基础使用

语法与文件结构

Posted by orgaworl on September 24, 2024

0. 示例

在命令行中调用CMake

1
2
3
cd build
cmake ..
make

编写CMakeList.txt:

  • 手动指定文件

    1
    2
    3
    
      cmake_minimum_required (VERSION 2.8)
      project (demo)
      add_executable(main main.c testFunc.c)
    
  • 自动选定所有文件

    1
    2
    3
    4
    
      cmake_minimum_required (VERSION 2.8)
      project (demo)
      aux_source_directory(. SRC_LIST) //将本目录所有源代码添加
      add_executable(main ${SRC_LIST})
    
  • 半自动选定文件

    1
    2
    3
    4
    5
    6
    7
    
      cmake_minimum_required (VERSION 2.8)
      project (demo)
      set( SRC_LIST
           ./main.c
           ./testFunc1.c
           ./testFunc.c)
      add_executable(main ${SRC_LIST})
    
  • 分文件夹编写

    1
    2
    3
    4
    5
    6
    7
    8
    
      cmake_minimum_required (VERSION 2.8)
      project (demo)
      include_directories (test_func1 test_func2) # 添加.h文件
      aux_source_directory (test_func1 SRC_LIST1) # 添加源文件组1
      aux_source_directory (test_func2 SRC_LIST2) # 添加源文件组2
    
      # 编译可执行文件
      add_executable (main main.c ${SRC_LIST1} ${SRC_LIST2}) 
    

1. 语法

基础信息

1
2
3
4
5
# 基础信息
cmake_minimum_required (VERSION 2.8)  # 指定CMake最低版本
project (project_name language)       # 项目名称+编程语言
set(CMAKE_CXX_STANDARD 11)            # CPP 版本
set(CMAKE_CXX_STANDARD_REQUIRED ON)

库依赖与链接

1
2
3
4
5
6
7
8
9
# 自动检测外部库
find_package(<packName> <version> REQUIRED PATHS <path>)

#设置包含目录和链接目录:
include_directories(${<packName>_INCLUDE_DIRS})
link_directories(${<packName>_LIBRARY_DIRS})

# 链接
target_link_libraries(<target>  <libraries>...)

添加源文件与编译

添加源文件

1
2
3
4
5
6
7
8
9
10
11
12
13
# 添加头文件路径
include_directories (${PROJECT_SOURCE_DIR}/include)

# 手动选定源代码文件到变量中
set( <SRC_LIST> func1.c func2.c func3.c) # var<-

# 将文件夹中源代码名保存到变量中
aux_source_directory (<dirPath> <SRC_LIST>) # ->var

# 添加子目录  
add_subdirectory(<srcPath>)

构建目标

1
2
3
4
5
6
7
8
# 编译为库文件,
add_library(<libName> <STATIC> <source_files>...)
set_target_properties(<libName> PROPERTIES COMPILE_DEFINITIONS "DEBUG")

#  编译为可执行文件, 指定生成的可执行文件和源文件
add_executable (<main> <source_files>...)
set_target_properties(<main> PROPERTIES COMPILE_DEFINITIONS "RELEASE")

  • 可同时定义多个构建目标, 每个目标可以有不同的构建设置和选项。

编译控制

常规变量

1
2
3
4
5
6
7
8
# 设置常规变量
set(<variable> <value> ...)

# 取消常规变量
unset(<variable>)

# 使用 ${<variable>} 语法进行引用。
${<variable>}

环境变量

修改设置环境变量

1
set(<var> <val>)

环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
PROJECT_NAME # 项目名称
CMAKE_CXX_STANDARD     # CPP标准
EXECUTABLE_OUTPUT_PATH # 编译输出 

# 工程编译发生的目录: 
CMAKE_BINARY_DIR
PROJECT_BINARY_DIR
<projectname>_BINARY_DIR

# 源文件
CMAKE_SOURCE_DIR
PROJECT_SOURCE_DIR
<projectname>_SOURCE_DIR

#当前处理的CMakeLists.txt 所在的路径。
CMAKE_CURRENT_SOURCE_DIR
CMAKE_CURRENT_BINARY_DIR
#如果是内部编译,它跟 CMAKE_CURRENT_SOURCE_DIR 一致
#如果是外部编译,他指的是 target 编译目录。
#使用我们上面提到的 ADD_SUBDIRECTORY(src   bin)可以更改这个变量的值。
#使用 SET(EXECUTABLE_OUTPUT_PATH    <新路径>) 并不会对这个变量造成影响,它仅仅修改了最终目标文件存放的路径。


编译流程控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 设置编译选项
option(MYDEBUG "enable debug compilation" OFF)
if (MYDEBUG)
    add_executable(main2 main2.c)
else()
    message(STATUS "Currently is not in debug mode")
endif()


# 提示
message("str")


# 添加编译选项
add_compile_options(-std=c++11 -Wall)

message函数,分为三个消息类型:

  • FATAL_ERROR(致命错误)
  • WARNING(警告)
  • STATUS(正常)

2. 工程文件结构

一般结构

  • CMakeLists.txt
  • bin
  • lib
  • build
  • include
    • func1.h
    • func2.h
  • src
    • CMakeLists.txt(可选)
    • main.cpp
    • func1.cpp
    • func2.cpp

单独使用一个cmake文件

1
2
3
4
5
6
7
8
9
10
11
12
cmake_minimum_required (VERSION 2.8)
project (demo)

# 添加编译结果存放路径
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
# 添加头文件存放路径
include_directories (include)
# 添加源代码路径到变量
aux_source_directory (src SRC_LIST)
# 选定源代码编译
add_executable (main ${SRC_LIST})

两个cmake文件结合

1
2
3
4
# CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
project (demo)
add_subdirectory (src)
1
2
3
4
5
# src/CMakeLists.txt
include_directories (../include)
aux_source_directory (. SRC_LIST)
add_executable (main ${SRC_LIST})
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
1
2
3
4
#  编译命令 (Makefile在build目录下生成)
cd build 
cmake ..
make

3. CMake调用

基础

1
2
3
4
5
#  指定生成器
cmake -G "Ninja" ..

# 指定构建类型
cmake -DCMAKE_BUILD_TYPE=Release ..

跨平台编译

交叉编译

Reference