当前位置: 首页 > ai >正文

C++项目中使用CMake编译

C++项目中使用CMake管理头文件的方法

在C++项目里,为了让代码组织更合理、管理更便捷,一般会把头文件(.h或者.hpp文件)和源文件(.cpp文件)分开存放。把头文件存于include文件夹中,是一种常见且值得推荐的做法。下面为你介绍在使用CMake构建项目时,将头文件放在include文件夹下并正确引用它们的具体步骤:

1. 创建项目结构

首先,要搭建一个合理的项目结构。示例如下:

MyProject/
|-- include/
|   |-- MyHeader.h 
|-- src/
|   |-- main.cpp
|   |-- OtherSourceFile.cpp
|-- CMakeLists.txt

2. 编写CMakeLists.txt

在CMakeLists.txt文件中,你得设置好包含头文件目录的路径,同时告知CMake该如何编译源文件。

cmake_minimum_required(VERSION 3.10)
project(MyProject)# 设置C++标准,例如C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)# 指定头文件和源文件目录
include_directories(include)  # 包含头文件目录# 列出所有的源文件
set(SOURCE_FILESsrc/main.cppsrc/OtherSourceFile.cpp
)# 添加可执行文件
add_executable(MyProject ${SOURCE_FILES})

3. 引用头文件

头文件定义参考

#ifndef MATH_H
#define MATH_Hint add(const int &, const int &);#endif

在源文件里引用头文件时,要采用相对路径,或者借助之前在include_directories中指定的路径。比如,在main.cpp中引用MyHeader.h:

#include "MyHeader.h"  // 使用引号是因为路径是相对的,指向include目录下的文件

4. 构建项目

在项目的根目录(也就是包含CMakeLists.txt的目录)打开终端或命令提示符,运行下面的命令来配置和构建项目:

mkdir build  # 创建一个build目录用于存放构建文件
cd build     # 进入build目录
cmake ..     # 配置项目,使用当前目录的CMakeLists.txt文件生成Makefile等构建文件
make         # 编译项目,生成可执行文件(或在Windows上使用cmake --build .)

如何构建指定的可执行文件

当CMakeLists.txt中有多个add_executable命令,像这样:

add_executable(MyExecutable main.cpp math.cpp)
add_executable(test test.cpp math.cpp)

若要构建指定的可执行文件,有以下两种方法:

方法一:使用–target参数(推荐)

cmake --build . --target MyExecutable  # 构建MyExecutable
cmake --build . --target test          # 构建test

方法二:使用make target(适用于Unix Makefiles)

make MyExecutable  # 构建MyExecutable
make test          # 构建test

注意事项

  1. 要保证在include_directories中指定的路径是相对于当前CMakeLists.txt文件的。要是include目录不在同一层级,可能就需要调整路径或者使用绝对路径。例如,当项目结构更深时,可能要写成:
include_directories(${CMAKE_SOURCE_DIR}/some/path/include)
  1. 从CMake 3.10版本开始,推荐使用target_include_directories来替代include_directories,这样能够更精准地控制哪些目标(例如库或可执行文件)包含这些目录。示例如下:
add_executable(MyProject ${SOURCE_FILES})
target_include_directories(MyProject PRIVATE include)  # PRIVATE表示仅该目标需要这些目录,不会传播到链接的其他目标。

使用这种方法能够避免在全局范围内设置不必要的包含目录。

http://www.xdnf.cn/news/9942.html

相关文章:

  • WPF响应式UI的基础:INotifyPropertyChanged
  • OpenWebUI(1)源码学习构建
  • 公链地址生成曲线和算法
  • spring-boot redis lua脚本实现滑动窗口限流
  • 如何以 9 种方式将照片从 iPhone 传输到笔记本电脑
  • python打卡day40
  • STM32 搭配 嵌入式SD卡在智能皮电手环中的应用全景评测
  • 30V/150A MOSFET 150N03在无人机驱动动力系统中的性能边界与热设计挑战
  • 鸿蒙 HarmonyOS - SideBarContainer 组件自学指南
  • OleDbParameter.Value 与 DataTable.Rows.Item.Value 的性能对比
  • RCU初步分析
  • leetcode动态规划—打家劫舍系列
  • iOS 使用CocoaPods 添加Alamofire 提示错误的问题
  • 改写自己的浏览器插件工具 myChromeTools
  • RSTP介绍加实操
  • 2025年05月30日Github流行趋势
  • MyBatisPlus--快速入门
  • 【计算机网络】传输层TCP协议——协议段格式、三次握手四次挥手、超时重传、滑动窗口、流量控制、
  • 得物前端面试题及参考答案(精选50道题)
  • CppCon 2014 学习:Making C++ Code Beautiful
  • 测试分类详解
  • 【C++】22. 红黑树封装实现Mymap和Myset
  • 【Python】第一弹:对 Python 的认知
  • 计算机网络 HTTP篇常见面试题总结
  • 【前端】macOS 的 Gatekeeper 安全机制阻止你加载 bcrypt_lib.node 文件 如何解决
  • 图解深度学习 - 基于梯度的优化(梯度下降)
  • MySQL之约束和表的增删查改
  • 清华大学发Nature!光学工程+神经网络创新结合
  • 代码随想录算法训练营 Day61 图论ⅩⅠ Floyd A※ 最短路径算法
  • 从认识AI开始-----解密门控循环单元(GRU):对LSTM的再优化