4. 搜索文件
4. 搜索文件
如果一个项目里边的源文件很多,在编写 CMakeLists.txt
文件的时候不可能将项目目录的各个文件一一罗列出来,这样太麻烦也不现实。所以,在 CMake 中为我们提供了搜索文件的命令,可以使用 aux_source_directory
命令或者 file
命令。
4.1 方式一
在 CMake 中使用 aux_source_directory
命令查找某个路径下的 所有源文件
,命令为:
aux_source_directory(<dir> <variable>)
dir
:要搜索的目录variable
:将从dir
中搜索到的源文件列表存储到该变量中
如我现在的文件目录结构是这样的:
proj3
├── CMakeLists.txt
├── bin
├── include
│ └── head.h
└── src
├── add.cpp
├── div.cpp
├── main.cpp
├── mul.cpp
└── sub.cpp
3 directories, 8 files
可以看到,源文件都被移动到 src
目录下,头文件被移动到了 include
目录下,此时使用 aux_source_directory
可以写成如下形式:
cmake_minimum_required(VERSION 3.17)
proj(CALC)
set(CMAKE_CXX_STANDARD 20)
set(HOME ${CMAKE_CURRENT_SOURCE_DIR})
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)
aux_source_directory(${CMAKE_CURRENT_DIR}/src SRC_LIST)
add_executable(calc ${SRC_LIST})
4.2 方式二
如果一个项目里边的源文件很多,在编写 CMakeLists.txt
文件的时候不可能将项目目录的各个文件一一罗列出来,这样太麻烦了。所以,在CMake中为我们提供了搜索文件的命令,他就是 file
(当然,除了搜索以外通过 file
还可以做其他事情)。
file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型)
GLOB
: 将指定目录下搜索到的满足条件的所有文件名生成一个列表,并将其存储到变量中。GLOB_RECURSE
:递归搜索指定目录,将搜索到的满足条件的文件名生成一个列表,并将其存储到变量中。
如:搜索当前工程根目录 src
中所有的源文件,将其存储到变量 MAIN_SRC
中
file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
搜索当前目录下 include
中所有的头文件,并将其存储到 HEAD_SRC
中
file(GLOB HEAD_SRC ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h)
-
CMAKE_CURRENT_SOURCE_DIR
宏表示当前访问的CMakeLists.txt
文件所在的路径 -
关于要搜索的文件路径和类型可加双引号,也可不加:
file(GLOB HEAD_SRC "${CMAKE_CURRENT_SOURCE_DIR}/include/*.h")
4.2 包含头文件
在编译项目源文件的时候,很多时候都需要将源文件对应的头文件路径指定出来,这样才能保证在编译过程中编译器能够找到这些头文件,并顺利通过编译。在CMake中设置要包含的目录也很简单,通过一个命令就可以搞定了,他就是 include_directories
:
include_directories(headpath)
如:
include(${PROJECT_SOURCE_DIR}/include)
# include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) # 这个也行
PROJECT_SOURCE_DIR
:宏,值为我们使用 cmake 命令时,后面紧跟的目录,一般为工程的根目录
此时的 CMakeLists.txt 文件内容如下:
# 指定cmake最低版本
cmake_minimum_required(VERSION 3.17)
# 项目名称
project(CALC)
# 指定C++标准
set(CMAKE_CXX_STANDARD 20)
# 指定生成路径
# set(HOME /home/yuzu/cmake_proj/proj2)
set(HOME ${CMAKE_CURRENT_SOURCE_DIR})
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)
# 包含头文件
include_directories(${PROJECT_SOURCE_DIR}/include)
# 指定源代码所在路径,保存文件列表到到变量 MAIN_SRC
file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
# 设定可执行文件名称,绑定源文件变量
add_executable(calc ${MAIN_SRC})
指定头文件目录的优点:
-
不需要更改源代码中
#include
后面的代码,不需要修改路径。 -
可以像引入标准库一样引入第三方库,不必区分
< >
和""
,如:
注:如果使用
vscode
打开工程,#include "header.h
还是会报错,那么就删除生成了的文件和目录,重新打开编辑器,工程就会重新开始构建