需求
编写跨平台的工程时,因为项目比较大,文件很多,开发人员很多,不想一一列举add_executable
里边的文件
解决
用FILE
宏获取某个指定目录下的同一类型的所有文件,用DIAGNOSTIC
和SERIALIZE
两个变量来分别存储所有符合条件的文件名,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
里边添加DIAGNOSTIC
和SERIALIZE
两个变量,这样新增文件只要执行一下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函数可以实现递归式检索,但一般一级目录就够了