按功能将文件划分(不推荐)
CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
project (demo)
# 向工程添加多个指定头文件的搜索路径,路径之间用空格分隔
include_directories (demo1 demo2)
#使用aux_source_directory把当前目录下的源文件存列表存放到变量SRC_LIST里 aux_source_directory (demo1 SRC_LIST1)
aux_source_directory (demo2 SRC_LIST2)
add_executable (${PROJECT_NAME} main.c ${SRC_LIST1} ${SRC_LIST2})
include_directoris:向工程添加多个指定头文件的搜索路径,路径之间用空格间隔
如果没有使用include_directoris(),则需要用以下方式引用头文件
#include "demo1/demo1.h"
#include "demo2/demo2.h"
按类型进行文件划分(推荐)
方法一
cmake_minimum_required(VERSION 3.8)
project(demo)
set(SOURCES src/main.c src/demo1.c src/demo2.c)add_executable(${PROJECT_NAME} ${SOURCES})
target_include_directories(${PROJECT_NAME}
PRIVATE ${PROJECT_SOURCE_DIR}/include)
cmake命令说明
- 源文件变量(不建议)
创建一个包含源文件的变量,以便于将其轻松添加到多个命令中,例如add_executable()函数。
在SOURCES变量中设置特定文件名的另一种方法是使用GLOB命令使用通配符模式匹配来查找文件。file(GLOB SOURCES "src/*.cpp")
使用*这个通配符,表示所有.cpp结尾的文件都会包含到这个SOURCES变量。
set(SOURCES src/main.c src/demo1.c src/demo2.c)
add_executable(${PROJECT_NAME} ${SOURCES})
建议方式
add_executable(${PROJECT_NAME} src/main.c src/demo1.c src/demo2.c)
头文件目录
当您有其他需要包含的文件夹(文件夹里有头文件)时,可以使用以下命令使编译器知道它们: target_include_directories()
各种系统变量
Variable | Info |
---|---|
CMAKE_SOURCE_DIR | 根源代码目录,工程顶层目录。暂认为就是PROJECT_SOURCE_DIR |
CMAKE_CURRENT_SOURCE_DIR | 当前处理的 CMakeLists.txt 所在的路径 |
PROJECT_SOURCE_DIR | 工程顶层目录 |
CMAKE_BINARY_DIR | 运行cmake的目录。外部构建时就是build目录 |
CMAKE_CURRENT_BINARY_DIR | The build directory you are currently in.当前所在build目录 |
PROJECT_BINARY_DIR | 暂认为就是CMAKE_BINARY_DIR |
可以在CMakeLists中,利用message()命令输出一下这些变量,也可以在源代码.cpp中使用
方法二
fileTree
项目目录下的CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(demo)
add_subdirectory(src)
cmake命令说明
add_subdirectory (source_dir [binary_dir] [EXCLUDE_FROM_ALL])
向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制的存放位置
source_dir
必选参数。该参数指定一个子目录,子目录下应该包含CMakeLists.txt
文件和代码文件。子目录可以是相对路径也可以是绝对路径,如果是相对路径,则是相对当前目录的一个相对路径。binary_dir
可选参数。该参数指定一个目录,用于存放输出文件。可以是相对路径也可以是绝对路径,如果是相对路径,则是相对当前输出目录的一个相对路径。如果该参数没有指定,则默认的输出目录使用source_dir
。EXCLUDE_FROM_ALL
可选参数。当指定了该参数,则子目录下的目标不会被父目录下的目标文件包含进去,父目录的CMakeLists.txt
不会构建子目录的目标文件,必须在子目录下显式去构建。例外情况:当父目录的目标依赖于子目录的目标,则子目录的目标仍然会被构建出来以满足依赖关系(例如使用了target_link_libraries)
。
src目录下的CMakeLists.txt
include_directories(${PROJECT_SOURCE_DIR}/include)
aux_source_directory(. SOURCE)
add_executable(${PROJECT_NAME} ${SOURCE})set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
命令 | 说明 | 示例 |
---|---|---|
include_directories | 该命令是用来向工程添加多个指定头文件的搜索路径,路径之间用空格分隔 | include_directories (../include) |
add_subdirectory() | 向当前工程添加存放源文件的子目录 | add_subdirectory (src) |
set | 用于定义变量的 | set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) |
- EXECUTABLE_OUT_PATH和PROJECT_SOURCE_DIR是CMake自带的预定义变量,其意义如下
示例 | 说明 |
---|---|
EXECUTABLE_OUTPUT_PATH | 目标二进制可执行文件的存放位置 |
PROJECT_SOURCE_DIR | 工程的根目录 |
关于add_subdirectory