C++的项目管理与搭建

张开发
2026/5/17 12:09:37 15 分钟阅读
C++的项目管理与搭建
在现代软件开发中C作为一门高性能、面向对象的编程语言广泛应用于服务端、嵌入式、游戏、算法等领域。随着程序规模不断扩大代码会从最初的单文件main.cpp逐步演变成数十个、甚至上百个源文件.cpp与头文件.hpp/.h并按照功能拆分成多个目录、多个模块。此时如何高效管理源代码、组织目录结构、自动编译链接、跨平台构建就成为必须解决的问题 —— 这就是 C 项目管理 的核心意义。而在 C 项目管理中最主流、最标准、跨平台的构建工具就是 CMake。CMake 并不是编译器而是一个项目构建生成工具。它通过统一的配置文件CMakeLists.txt自动根据不同平台生成对应的构建文件如 Linux 下的 Makefile、Windows 下的 VS 工程文件。开发者只需要编写一次构建规则就能在任何平台编译项目真正实现一次编写到处构建。首先,下载Cmake在linux系统下,Cmake的下载命令sudo apt install cmake下载完成后可以通过cmake -version命令查看cmake的版本号Cmake的使用首先,假设我们拥有一个项目 main.cpp文件和函数文件funa.cpp,funa.hpp#includefuna.hpp #includeiostream using namespace std; int main() { printf(HELLO PROJECT); funa(100); }我们需要在其同级目录下编写CMakeLists.txt文件cmake_minimum_required(VERSION 3.0)//指定cmake的最低版本需求 project(demo)//项目名 add_executable(main main.c funa.cpp) //生成可执行文件#includestdio.h void funa(int num) { printf(%d\n,num); }现在我们的项目拥有两个了一个是我们的主程序main.cpp 一个是我们的CMakeLists.txt,一旦我们使用了cmake .命令就会在当前目录下生成一系列文件,以及我们的可执行程序,但是他们在与我们的主程序处于同一级目录下,非常不便于管理,所以我们新建一个文件夹build用来专门存放生成的文件,这样当我们想清理文件时,直接删掉build就好了!现在我们的项目结构变成了这样这时候在build中使用cmake生成可执行文件就变成了这样我们使用make命令就可以直接生成我们的可执行文件!此时我的目录格式如图所示正规目录继续写的正规一点,我们一般将头文件放在include目录下,源文件一般放在src目录下,而生成的可执行文件我们一般放在bin目录下!这样就可以继续升级我们的项目!就像这个样子,这个时候我们需要对我们的CMakeLists.txt文件做一些更改,让它满足我们对于这个项目的需求cmake_minimum_required(VERSION 3.0) project(demo) add_subdirectory(src)add-subdirectory : 这个语句的作用是增加编译子目录。其基本语法格式是add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])source_dir源代码目录指定一个包含CMakeLists.txt和代码文件所在的目录该目录可以是绝对路径也可以是相对路径对于后者相对路径的起点是CMAKE_CURRENT_SOURCE_DIR。此外如果子目录再次包含的CMakeLists.txt则将继续处理里层的CMakeLists.txt而不是继续处理当前源代码。binary_dir二进制代码目录这个目录是可选的如果指定cmake命令执行后的输出文件将会存放在此处若没有指定默认情况等于source_dir没有进行相对路径计算前的路径也就是CMAKE_BINARY_DIR。EXCLUDE_FROM_ALL标记这个标志是可选的如果传递了该参数表示新增加的子目录将会排除在ALL目录之外可能是make系统中的make all表示这个目录将从IDE的工程中排除。用户必须显式在子文件这个编译目标手动cmake之类的。指定了这个文件夹表示这个文件夹是独立于源工程的add_subdirectory()add_subdirectory这个命令用于添加源文件子目录同时还可以指定中间二进制和目标二进制的生成路径。EXCLUDE_FROM_ALL将会将这个目录从编译中排除如工程的例子需要等待其他编译完成后再进行单独的编译。通常子目录应该包含自己的project()命令这样以来整个编译命令将会产生各自的目标文件。如果把CMakeLists.txt与VS IDE比较总的CMakeLists.txt就相当于解决方案子CMakeLists.txt就相当于在解决方案下的工程文件。还有一个需要注意的是如果编译父CMakeLists时依赖了子CMakeLists.txt中的源文件那么该标志将会被覆盖也就是也会处理以满足编译任务。这里指定src目录下存放了源文件当执行cmake时就会进入src目录下去找src目录下的CMakeLists.txt所以在src目录下也建立一个CMakeLists.txt内容如下:aux_source_directory(. SRT_LIST) include_directories(../include) add_executable(main ${SRT_LIST}) set(EXECUTABLE_OUTPUT_PATH${PROJECT_SOURCE_DIR}/bin)aux_source_directoryaux_source_directory(. SRT_LIST) :表示将当前目录下的所有文件(.c/.cpp)存放到变量SRT_LIST当中include_directoriesinclude_directories告诉编译器去哪里找头文件.h/.hppadd_executableadd_executable:SRC_LIST 里面所有的 .cpp 文件编译成一个名叫main的可执行程序#includestdio.h void funb(int num) { printf(%d\n,num); }funb与funa相同!我们发现我们的可执行程序并不在我们的build目录中而是存到了bin当中总结1. cmake_minimum_required作用指定 CMake 最低版本cmakecmake_minimum_required(VERSION 3.10)2. project作用设置项目名字cmakeproject(demo)3. include_directories作用告诉编译器去哪里找头文件.h/.hppcmakeinclude_directories(../include)include_directories(test_func test_func1)4. aux_source_directory作用自动搜索目录下所有 .c/.cpp 源文件cmakeaux_source_directory(. SRC_LIST)aux_source_directory(test_func SRC_LIST)5. add_executable作用生成可执行程序maincmakeadd_executable(main main.cpp)add_executable(main ${SRC_LIST})6. set作用设置变量 / 设置可执行文件输出路径cmakeset(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)CMake 是通过简单的配置自动帮我们编译、链接、管理 C 多文件、多目录项目是现代 C 开发必须掌握的工具

更多文章