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 后面的代码,不需要修改路径。

  • 可以像引入标准库一样引入第三方库,不必区分 < >"",如:

    image-20231201123846858

注:如果使用 vscode 打开工程,#include "header.h 还是会报错,那么就删除生成了的文件和目录,重新打开编辑器,工程就会重新开始构建

posted @ 2024-07-15 10:41  kobayashilin1  阅读(30)  评论(0编辑  收藏  举报