需求

编写跨平台的工程时,因为项目比较大,文件很多,开发人员很多,不想一一列举add_executable里边的文件

解决

FILE宏获取某个指定目录下的同一类型的所有文件,用DIAGNOSTICSERIALIZE两个变量来分别存储所有符合条件的文件名,include_directories也可以自动包含目录下的所有头文件

1
2
3
4
5
FILE(GLOB_RECURSE DIAGNOSTIC ${CMAKE_SOURCE_DIR}/diagnostic/*.c)
include_directories(${CMAKE_SOURCE_DIR}/diagnostic)

FILE(GLOB_RECURSE SERIALIZE ${CMAKE_SOURCE_DIR}/serialize/*.c)
include_directories(${CMAKE_SOURCE_DIR}/serialize)

再在add_executable里边添加DIAGNOSTICSERIALIZE两个变量,这样新增文件只要执行一下cmake就可以了

1
2
3
4
5
6
7
add_executable(zhd-desktop
main.c
${DIAGNOSTIC}
${SERIALIZE}
logo.rc
res.qrc
)

示例

以下是一个动态添加源文件(SRC)、头文件(HEADERS)、资源文件(RES)的工程示例,cmake脚本一下子清爽了好多

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
cmake_minimum_required(VERSION 3.5)

project(tractor LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt5 COMPONENTS Widgets REQUIRED)

include_directories(${CMAKE_SOURCE_DIR})

set(SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})

file(GLOB SRC
"${SRC_DIR}/*.cpp"
"${SRC_DIR}/*.cxx"
"${SRC_DIR}/*.cc"
"${SRC_DIR}/*.c"
)

file(GLOB HEADERS
"${SRC_DIR}/*.h"
"${SRC_DIR}/*.hpp"
"${SRC_DIR}/*.hxx"
)

file(GLOB RES
"${SRC_DIR}/*.ui"
"${SRC_DIR}/*.qrc"
)

add_executable(${PROJECT_NAME} ${SRC} ${HEADERS} ${RES})

target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Widgets)

需要递归检索用GLOB_RECURSE,只需要当前目录用GLOB

总结

  • 需要约定俗成的编码规范:比如源文件放哪里、头文件放哪里、资源文件放哪里
  • 每次删减文件都需要执行一下cmake
  • file函数可以实现递归式检索,但一般一级目录就够了

© 2025 hywing 使用 Stellar 创建
总访问 113701 次 | 本页访问 326