首页 > 其他分享 >4. 搜索文件

4. 搜索文件

时间:2024-07-15 10:41:20浏览次数:12  
标签:文件 CMAKE SRC SOURCE 搜索 include DIR

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 还是会报错,那么就删除生成了的文件和目录,重新打开编辑器,工程就会重新开始构建

标签:文件,CMAKE,SRC,SOURCE,搜索,include,DIR
From: https://www.cnblogs.com/kobayashilin1/p/18302666

相关文章

  • C# 返回文件夹及子目录
    ///<summary>///返回文件夹及子目录的文件夹///</summary>///<paramname="directory"></param>///<paramname="files"></param>publicstaticvoidGetFiles(stringdirectory,refDi......
  • ELK Stack - Elasticsearch · 搜索引擎 · 部署应用 · 内部结构 · 倒排索引 · 服
    系列目录ELKStack-Elasticsearch·搜索引擎·全文检索·部署应用·内部结构·倒排索引·服务接入ELKStack-Kibana(待续)ELKStack-Logstash(待续)ELKStack-Beats(待续)ELKStack-ApplicationPerformanceMonitoring(待续)本章基于:RHELinux......
  • Python中 `__pycache__` 文件夹是什么?
    引言当你编写一个独立的Python脚本时,目录结构看起来可能没什么特别。但随着项目逐渐变得复杂,你可能会倾向于将一些功能分离到其他模块或包中。这时,你可能会发现在源文件旁边,似乎毫无规律地,突然冒出一个__pycache__文件夹。project/│├──mathematics/│││├──......
  • 文件安全传输系统,如何保障信创环境下数据的安全传输?
    文件安全传输系统是一套旨在保护数据在传输过程中的安全性和完整性的技术或解决方案。通常包括以下几个关键组件:加密:使用强加密算法来确保文件在传输过程中不被未授权访问。身份验证:确保只有授权用户才能访问或传输文件。完整性校验:通过哈希函数等方法来验证文件在传输过程中是......
  • 20240713总结(搜索专题,但是不想搜索)
    A-DimaandTrapGraphCF366DDimaandTrapGraph题解:考虑二分满足答案区间,但是发现这个区间并不具有单调性。于是我们考虑固定一个端点(不妨固定左端点),然后二分右端点,此时右端点是有单调性的。然后思考如何判断是否联通。这题可以直接使用并查集,把在当前判断的区间内的边并......
  • 理想的文件摆渡系统,了解一下!
    "文件摆渡"通常指在不同系统、设备或平台之间传输文件的过程,可以是手动摆渡,比如使用USB闪存驱动器、移动硬盘等物理存储设备来移动文件,也可以是自动化摆渡,比如通过网络或专门的文件摆渡系统来实现文件的传输。为了保护内部数据安全,企业通过会进行网络隔离,防止外部攻击和数据泄露......
  • Win11系统提示找不到LcRes.dll文件的解决办法
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个LcRes.dll文件(挑选合适的版本文件)把它放入......
  • Win11系统提示找不到libGLESv2.dll文件的解决办法
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个libGLESv2.dll文件(挑选合适的版本文件)把它......
  • Win11系统提示找不到learning_tools.dll文件的解决办法
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个learning_tools.dll文件(挑选合适的版本文件......
  • Win11系统提示找不到LockSearchAPI.dll文件的解决办法
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个LockSearchAPI.dll文件(挑选合适的版本文件)......