【CMake保姆级教程】搜索文件和包含头文件

举报
人才程序员 发表于 2024/01/29 08:21:54 2024/01/29
【摘要】 @TOC 前言CMake是一个跨平台的开源构建系统,它通过简化和自动化项目的构建过程,使软件开发变得更加容易。在CMake中,搜索文件和包含头文件是项目中必不可少的一部分。这一过程涉及到设置源文件、查找依赖项以及正确包含头文件,这对于确保项目的可维护性和可扩展性至关重要。在这份CMake保姆级教程中,我们将深入研究如何使用CMake搜索文件和包含头文件,使你能够更有效地管理和组织你的项目。 ...

@TOC


前言

CMake是一个跨平台的开源构建系统,它通过简化和自动化项目的构建过程,使软件开发变得更加容易。在CMake中,搜索文件和包含头文件是项目中必不可少的一部分。这一过程涉及到设置源文件、查找依赖项以及正确包含头文件,这对于确保项目的可维护性和可扩展性至关重要。

在这份CMake保姆级教程中,我们将深入研究如何使用CMake搜索文件和包含头文件,使你能够更有效地管理和组织你的项目。


一、搜索文件

1.1 为什么需要他

如果一个项目里边的源文件很多,在编写CMakeLists.txt文件的时候不可能将项目目录的各个文件一一罗列出来,这样太麻烦也不现实。所以,在CMake中为我们提供了搜索文件的命令,可以使用aux_source_directory命令或者file命令。

1.2 搜索方式1

例如现在的文件夹层级如下,src分为一个文件夹,那我们如果要去写源文件的路径就很麻烦,那怎么办呢:

ubuntu@ubuntu-2204:~/C/csdn-cmake$ tree -L 2
.
├── bin
│   └── app
├── build
│   ├── app
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── cmake_install.cmake
│   └── Makefile
├── CMakeLists.txt
└── src
    ├── func.cpp
    ├── func.h
    └── main.cpp

4 directories, 9 files

在 CMake 中使用aux_source_directory 命令可以查找某个路径下的所有源文件,命令格式为:

aux_source_directory(< dir > < variable >)

dir:要搜索的目录
variable:将从dir目录下搜索到的源文件列表存储到该变量中

那么上面这个文件夹层级我们就可以像下面这样写:

cmake_minimum_required(VERSION 3.0.0)
project(test)

set(SRC_LIST)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src SRC_LIST)

add_executable(app ${SRC_LIST})

其中CMAKE_CURRENT_SOURCE_DIR路径为CMakeLists.txt所在的路径
接下来使用cmake和make即可

ubuntu@ubuntu-2204:~/C/csdn-cmake/build$ cmake ..
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ubuntu/C/csdn-cmake/build
ubuntu@ubuntu-2204:~/C/csdn-cmake/build$ make
[ 33%] Building CXX object CMakeFiles/app.dir/src/func.cpp.o
[ 66%] Building CXX object CMakeFiles/app.dir/src/main.cpp.o
[100%] Linking CXX executable app
[100%] Built target app
ubuntu@ubuntu-2204:~/C/csdn-cmake/build$ 

1.3 搜索方法2

如果一个项目里边的源文件很多,在编写CMakeLists.txt文件的时候不可能将项目目录的各个文件一一罗列出来,这样太麻烦了。所以,在CMake中为我们提供了搜索文件的命令,他就是file(当然,除了搜索以外通过 file 还可以做其他事情)。

file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型)

GLOB: 将指定目录下搜索到的满足条件的所有文件名生成一个列表,并将其存储到变量中。
GLOB_RECURSE:递归搜索指定目录,将搜索到的满足条件的文件名生成一个列表,并将其存储到变量中。

注意:我们的aux_source_directory是搜索整个路径,而file需要指定文件后缀,即是文件类型

他的文件名称支持通配符

cmake_minimum_required(VERSION 3.0.0)
project(test)

set(SRC_LIST)
file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)

add_executable(app ${SRC_LIST})

接下来cmake和make即可:

ubuntu@ubuntu-2204:~/C/csdn-cmake/build$ cmake ..
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ubuntu/C/csdn-cmake/build
ubuntu@ubuntu-2204:~/C/csdn-cmake/build$ make
Consolidate compiler generated dependencies of target app
[ 33%] Building CXX object CMakeFiles/app.dir/src/func.cpp.o
[ 66%] Building CXX object CMakeFiles/app.dir/src/main.cpp.o
[100%] Linking CXX executable app
[100%] Built target app

二、包含头文件

2.1 为什么需要他?

如果在这样的一个文件层级结构中:

ubuntu@ubuntu-2204:~/C/csdn-cmake$ tree -L 2
.
├── bin
│   └── app
├── build
│   ├── app
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── cmake_install.cmake
│   └── Makefile
├── CMakeLists.txt
├── include
│   └── func.h
└── src
    ├── func.cpp
    └── main.cpp

5 directories, 9 files

我们的func.cpp如下图:
在这里插入图片描述
那么我们的头文件都放在include文件里面了,我们如果要让他不报错只能使用相对/绝对路径
但是如果文件夹一层包一层呢?那就非常的麻烦,所以我们需要包含头文件

2.2 包含头文件

本质

当我们说CMake包含头文件时,实际上是在告诉编译器在哪里可以找到项目中使用的头文件(头文件通常包含函数声明、类定义等信息)。头文件的本质含义是为编译器提供关于代码结构和接口的信息,以便在编译源文件时正确理解和处理代码。

用通俗易懂的话来解释,可以想象头文件就像是一份使用说明书,告诉编译器在哪里可以找到一些特定的功能。当你在代码中使用某个函数或类时,编译器需要知道这个函数或类的定义是什么样的,以便正确地生成代码。头文件就是这个说明书,告诉编译器在哪里能找到这些定义。

CMake帮助你指定这份说明书的位置。通过配置CMake,你告诉它哪些文件是头文件,然后编译器就能够按照这份说明书正确地处理你的代码,确保所有的函数和类都被正确识别和使用。

简而言之,CMake包含头文件的本质含义就是告诉编译器在哪里找到代码的说明书,以便编译器能够顺利地理解和处理你的代码。

include_directories:

include_directories(headpath)

使用上面这个cmake即可包含一个头文件的路径了

cmake_minimum_required(VERSION 3.0.0)
project(test)

set(SRC_LIST)
file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

add_executable(app ${SRC_LIST})
ubuntu@ubuntu-2204:~/C/csdn-cmake/build$ cmake ..
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ubuntu/C/csdn-cmake/build
ubuntu@ubuntu-2204:~/C/csdn-cmake/build$ make
Consolidate compiler generated dependencies of target app
[ 33%] Building CXX object CMakeFiles/app.dir/src/func.cpp.o
[ 66%] Building CXX object CMakeFiles/app.dir/src/main.cpp.o
[100%] Linking CXX executable app
[100%] Built target app
ubuntu@ubuntu-2204:~/C/csdn-cmake/build$ ./app
Hello CMake

现在我们就已经学完了!


总结

通过本教程,我们深入了解了CMake中搜索文件和包含头文件的关键概念和技巧。学会配置源文件、查找依赖项以及正确设置头文件路径,将为你的项目提供一个坚实的基础。

CMake的强大之处在于其灵活性和可定制性。通过遵循本教程中提供的指南,你可以更加自信地配置你的项目,确保它在不同平台和环境中都能够正确地构建。

希望这份保姆级教程能够帮助你更好地利用CMake,使你的项目管理变得更加轻松和高效。继续深入学习CMake的各项功能,发掘更多构建和管理项目的技巧,提升你的开发体验。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。