CMake使用详解二(多文件编译)

vscode Cmake 多目录,多文件夹,多文件联合编译配置 说明:单文件夹下的多个cpp的联合编译网上很多都是使用code runner 插件中的settings.json,修改g++ 后的参数为:*.cpp。其实该插件只是为了方便不同代码的执行,一般而言我们主要都是使用一种语言如c++、或者Python,该插件在命令层面应该是和tasks.json文件中的 -g,-o 命令重复的,主要作用起到了一个命令覆盖的作用。tssks.json文件:修改 -g 后的参数命令,将所有要编译的cpp文件包含进去;二、多文件夹,多目录、多cpp文件的联合编译。 阅读详情

续上一篇:CMake使用详解一(单文件编译)
CMake

1 同一目录,多个源文件

1.1 创建2个源文件

在mathPowerDemo2文件夹中新建两个cpp文件:

$ mkdir mathPowerDemo2
$ cd mathPowerDemo2
$ gedit main.cpp
$ gedit power.cpp
$ gedit power.h

main.cpp中源代码为:

#include <stdio.h>
#include <stdlib.h>
#include "power.h"			//特别注意自己定义的函数头文件需要用引号括起来

int main(int argc, char *argv[])
{
    if (argc < 3){
        printf("Usage: %s base exponent \n", argv[0]);
        return 1;
    }
    double base = atof(argv[1]);
    int exponent = atoi(argv[2]);
    double result = power(base, exponent);
    printf("%g ^ %d is %g\n", base, exponent, result);
    return 0;
}

power.cpp中源代码为:

#include "power.h"			//特别注意自己定义的函数头文件需要用引号括起来

double power(double base, int exponent)
{
    int result = base;
    int i;
    
    if (exponent == 0) {
        return 1;
    }
    
    for(i = 1; i < exponent; ++i){
        result = result * base;
    }
    return result;
}

同时编写power.h:

#ifndef POWER_H
#define POWER_H
double power(double base, int exponent);

#endif

此时,/mathPowerDemo2文件夹中的文件为:
在这里插入图片描述

1.2 编写CMakeLists.txt

新建CMakeLists.txt

$ gedit CMakeLists.txt

在CMakeLists.txt中输入:

# CMake最低版本要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (mathPowerDemo2)
# 制定生成目标
add_executable(mathPowerDemo2 main.cpp power.cpp)

如果同一个文件夹下,特别多的源文件怎么办呢?

使用aux_source_directory命令

该命令会查找制定目录下所有的源文件,然后把结果保存进指定的变量名,语法格式为:

aux_source_directory(<dir> <variable>)

对应的CMakeLists.txt修改为:

# CMake最低版本要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (mathPowerDemo2)
# 指定当前目录下的源文件,保存到<ALL_SRCS>变量中
aux_source_directory(. ALL_SRCS)
# 制定生成目标
add_executable(mathPowerDemo2 ${ALL_SRCS})

1.3 编译项目

$ cmake .
$ make 

得到可执行文件mathPowerDemo2,运行测试:

user@pc:~/Documents/mathPowerDemo2$ ./mathPowerDemo2 9 2
9 ^ 2 is 81

2 多个目录,多个源文件

2.1 在不同的目录下新建源代码

$ mkdir mathPowerDemo3
$ cd mathPowerDemo3
$ gedit main.cpp
$ mkdir math
$ cd math
$ gedit power.cpp
$ gedit power.h

此时的文件目录结构为:

./mathPowerDemo3
    |
    +--- main.cpp
    |
    +--- math/
          |
          +--- power.cpp
          |
          +--- power.h

2.2 编写CMakeLists.txt

对于这种情况,需要分别在项目根目录 mathPowerDemo3 和 math 目录里各编写一个 CMakeLists.txt 文件。为了方便,我们可以先将 math 目录里的文件编译成静态库再由 main 函数调用。

2.2.1 根目录中的 CMakeLists

返回上一层目录,编辑根目录中的 CMakeLists.txt :

cd ..
gedit  CMakeLists.txt

输入

cmake_minimum_required (VERSION 2.8)
project (mathPowerDemo3)
aux_source_directory(. ALL_SRCS)			# 添加当前目录下所有的源文件
add_subdirectory(math)						# 添加math子目录
add_executable(mathPowerDemo3 ${ALL_SRCS})	# 指定生成目标,注意这里要用${ALL_SRCS}!!!
target_link_libraries(mathPowerDemo3 power)	# 添加链接库,power是在math子目录的CMakeLists中定义的

第4行,使用命令 add_subdirectory 指明本项目包含一个子目录 math,这样 math 目录下的 CMakeLists.txt 文件和源代码也会被处理 。

第6行,使用命令 target_link_libraries 指明可执行文件 main 需要连接一个名为 power 的链接库 。

2.2.2 子目录中的 CMakeLists

进入子目录

cd math
gedit CMakeLists.txt

编辑子目录中的 CMakeLists.txt,这里不需要再重复指定版本号等等,只需要把文件都包含进来,然后生成一个链接库就行了,子目录中的CMakeLists本质上是去生成一个链接库。

aux_source_directory(. LIB_SRCS)			# 添加当前目录下所有的源文件
add_library (power ${LIB_SRCS})				# 当前目录下的文件生成一个链接库

在该文件中使用命令 add_library 将 src 目录中的源文件编译为静态链接库。

2.3 编译运行

在主目录下直接用cmake .和make命令就可以编译了,不需要进入math子文件夹。

$ cd ..
$ cmake .
$ make 

运行测试:

$ ./mathPowerDemo2 2 10
2 ^ 10 is 1024

测试成功

3 CMake使用小结

  1. 使用aux_source_directory命令把某个目录下的所有文件名保存到一个变量中
    aux_source_directory(<dir> <variable>)					# 添加<dir>目录下所有的文件,保存到<variable>变量中
    
  2. 使用add_executable命令把一系列文件编译成projectName这个目标文件
    add_executable(projectName ${variable})					# 把<variable>中的所有文件,编译成<projectName>
    
  3. 如果是多个目录编译,首先使用add_subdirectory命令需要把目录包含进来,然后使用target_link_libraries命令,把子项目链接到对应的主项目
    add_subdirectory(<sub_dir>)								# 添加一个子目录<sub_dir>
    target_link_libraries(projectName sub_projectName)		# 把子目录的<sub_projectName>库链接到<projectName>主库中
    
  4. 在多目录编译中,还需要在子目录的CMakeLists.txt中设置好链接库
    aux_source_directory(. <variable>)						# 添加子目录当前目录下所有的源文件,<.>表示当前目录
    add_library(sub_projectName ${variable})				# 当前目录下的文件生成一个链接库
    
C++多文件编程和cmake构建编译 C++多文件编程是项目工程化的模式,把多个功能拆分到独立的文件再在主入口文件中引用。在编写简短的程序时,通常一个源文件就够用了,所有的方法、函数、类都在一个文件中实现,优点是编译方便只需要g++编译器而不用额外的构建工具,但是当项目工程越来越大时,拆分源文件到独立文件进行开发,这样让程序源码结构更加清晰维护更加方便更利于团队协作。 阅读详情

相关推荐

如何在vs中创建一个CMake项目,包括介绍CMake相关的命令和实现多文件编译

在VS中创建一个CMake项目,介绍CMake相关命令,通过CMake实现多文件编译

yangzuhao2020的博客 5914

cmake入门篇--多文件编译

前面学习单文件编译,本文开始学习多文件编译,从一个目录多文件到多个目录多文件以及使用内部库

mvp_Dawn的博客 4072

CMake入门实践(二) 多文件构建

在上一节中,我们讲了怎么通过cmake构建一个最简单的HelloWorld项目,但是在实际上面,我们平时遇到的项目都是文件非常多的.这里应该怎么处理呢?这一部分重点解决实际上这个最常见的多个文件构建系统的问题. 一.单目录,多文件 这里直接说例子吧,完整的例子见LearningCMake/2.HelloWorld2/ 在HelloWorld2这个项目文件夹下面,我们有4个文件.分别是CM...

谢小小XH 1万+

CMake多文件编译

关于cmake多文件编译梳理。

weixin_45572737的博客 6223

【cmake】cmake 实现交叉编译

【cmake】cmake 实现交叉编译

challenglistic的博客 1万+

Cmake实现VScode中c++多文件编译(记录)

初学c++,一直无法在vscode中实现多文件编译,看了网上很多教程, 刚开始没想过用cmake(因为不懂),大多数的方法都是让修改launch.josn和task.josn,但是多次尝试后仍然不行,会出现各种我看不懂的问题,无法生成可执行文件,也不能调试,总是报错某某字符未被定义。虽然最后总结出来,感觉也不是很复杂,但是作为小白,这个过程真的很心酸。看过很多教程,花费了很多时间,经历一次又一次的失败。如果在软件中无法检测到cmake,但是在系统中可以检测到,重启电脑就行了。2、在vscode中安装插件。

qq_52045548的博客 3113

在VsCode中使用cmake编译c++多文件工程文件

在VsCode中使用cmake编译c++多文件工程文件0.准备工作1.开始编译1.1新建工程文件夹1.2编写CMakeLists.txt1.3编译1.4可能出现的问题附录1-CMakeLists.txt常用命令附录2-解释Vsc的CmakeTools做了什么 0.准备工作 本文不介绍c++单文件的编译,事实上使用cmake编译多文件的工程项目也不需要配置.vscode/tasks.json、.vscode/launch.json、.vscode/c_cpp_properties.json这三个文件。 需要

qq_41603726的博客 1万+

Win11下基于VSCode与CMake对多文件C/C++项目进行编译+运行+调试【保姆级教程】

本篇介绍一下如何在 Windows11 的 VSCode 开发环境下利用 CMake 工具进行 C/C++ 多文件项目的编译、调试、运行…【绝对保姆级】

2301_80548189的博客 2053

【ubuntu(Linux)安装Vs code并配置c++编译及cmake多文件编译】

从虚拟机ubuntu建立到vscode构建cmake编译环境配置

Tengfei_Y的博客 1万+

如何在windows下使用cmake编译源码

MyProject/└── build/在MyProject目录下创建并编辑。创建build目录并进入。使用cmake命令生成构建文件。使用适当的命令编译项目。运行生成的可执行文件。

cdj444asdg的博客 3345

使用CMake进行多文件编程

使用CMake进行多文件编程CMake是一个跨平台的开源构建工具,用于管理C++项目的构建过程。它可以自动生成适合不同平台和编译器的构建脚本,并提供了一种简化和组织多文件项目的方式。在本篇文章中,我们将探讨如何使用CMake来构建一个包含多个.cpp.hpp和.h文件的C++项目。

PixelCoder的博客 749

CMake交叉编译简单教程

首先要安装cmaek 然后安装交叉编译链 一、CMake简介: CMake是一个跨平台的安装(编译)工具,可以通过简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件。   二、CMake命令 CMake的语句都写在一个叫做CMakeLists.txt的文件里。常见的CMake内置变量和命令如下: https://blog.csdn....

qq_24011271的博客 3万+

Vue2项目实战:vue2-org-tree实现动态组织架构图

本文详细介绍了如何在Vue2项目中使用vue2-org-tree组件实现动态、可交互的组织架构图。内容涵盖从快速安装、基础渲染到核心功能实战,包括水平布局、节点展开折叠、响应式数据绑定、深度自定义节点内容以及事件处理。同时提供了性能优化、样式覆盖等避坑指南,并通过一个完整的企业级Demo展示了如何打造功能丰富的架构图,助力高效开发后台管理系统。

weixin_28040125的博客 522

VSCode编译单文件及多文件方法(基于g++,cmake,json三种方法)

文章目录一 、单文件编译二、多文件编译二、使用步骤1.基于g++2.基于cmake3.不用cmake仅仅是修改json文件4.这个方法我还没实现(有bug) 一 、单文件编译 #include <iostream> using namespace std; void swap(int &a ,int &b){ int temp; temp = a; a = b; b = temp; } int main(int argc , char **ar

上海交通大学电院毕业,现互联网大厂开发工程师 8362

OpenClaw 核心命令深度解析:/think high、/reasoning on、/verbose on 功能与实战指南

本文深入解析OpenClaw框架的三大核心命令:/think high实现极限深度推理,突破常规思考瓶颈;/reasoning on提供透明化推理过程,增强决策可信度;/verbose on控制详细输出级别。文章从技术架构、实现原理、配置方法和典型场景四个维度,详细阐述了各命令的功能特性与实战应用,包括法律分析、代码调试和商业决策等复杂场景的最佳实践。同时提供了多级配置方案和资源消耗参考,帮助用户根据任务复杂度灵活调配AI资源,实现效率与深度的最优平衡。

qq_43344878的博客 942

【物理模拟】PBD算法详解

参考MatthiaMuller的十分钟物理(他就是PBD算法的发明者)

beidou111的博客 9499

VS Code使用 CMake 或 Makefile管理C++多文件编译

使用 CMake 或 Makefile 是更加标准和灵活的方法来管理多文件编译。以下是一个简单的示例,展示了如何使用 CMake 来构建包含多个源文件的 C++ 项目。【注】在我测试C++静态全局对象初始化的过程中,由于使用g++后面跟需要编译的文件名太过于麻烦,特整理下CMake的管理多文件编译的方法。

BirdsLife的博客 3070

摄像机实时接入分析平台视频分析网关AI智能分析智慧营业厅方案

通过智能化的改造,可以提高营业厅的运营效率,降低运营成本,同时提升客户体验和安全保障。

EasyDarwin开源社区技术博客 703

Vscode + CMake 构建C++ 多文件编译

vscode + CMake实现C++多文件编译

zHzAim的博客 1858

利用恒源云云端GPU高效训练YOLOv11模型全流程:从环境搭建到模型部署,让你摆脱硬件束缚

记住,云端GPU的核心优势是“弹性算力+一键环境”,只要把握好这一工具特性,再结合YOLOv11的高性能模型架构,你也能在计算机视觉领域快速落地项目。接下来,我们从工具准备到模型部署,一步步带你实现高效训练,真正帮你解决资源与效率的核心痛点。凭借其在目标检测、实例分割任务上的卓越性能,成为众多开发者的首选。据统计,使用云端GPU训练YOLOv11,在处理百万级数据集时,训练效率较本地普通GPU提升。在安防监控中,YOLOv11可实时检测人员、车辆异常行为,某园区采用该方案后,异常事件识别准确率达。

LXY_LOVE36的博客 213

DSP篇--C6678功能调试系列之EDMA3调试

EDMA主要用于数据的搬运,发送、接收,其搬运数据的形式有;AB模式,ABC模式以及ping-pong模式。 EDMA3分初始化、参数配置、以及中断配置。其中中断配置则需要注意的内容主要有:挂载的TC通道,对应的触发事件,以及中断的使能。

nanke_yh的博客 1720

VSCode运行多文件C++教程:使用CMake

事先说明 这篇文章是一个CMake工具的简单使用介绍。缘起是因为上个学期上编译原理的课程要求做课程设计,用C++实现。 一直以来出于一种奇妙心态的我非常厌恶使用 Visual Studio 这种笨重的IDE,向来用VScode作为C++主力编辑器,然而很遗憾VSCode自身不怎么支持C++多文档的编译(很麻烦,要不停的修改json配置文件),无奈为了寻求出路就稍微学了一下CMake来组织工程。 本...

frostime的博客 2万+

芒果YOLO11改进176:2025最新顶会论文|尺度动态损失函数Scale-based Dynamic Loss,即插即用|以减少标签不准确对损失函数稳定性的影响

芒果YOLO11改进186:2025最新顶会论文|尺度动态损失函数Scale-based Dynamic Loss,即插即用|以减少标签不准确对损失函数稳定性的影响

包括YOLOv5、YOLOv7、YOLOv8等模型改进 2131

基于VSCode和CMake进行C++多文件编译及调试

“避坑说明:头文件名称不要设置为include,会识别不到,报错” 对应文件代码如下: 头文件 print.h #ifndef _PRINT_H_ #define _PRINT_H_ #include <iostream> using namespace std; void print(); #endif 源文件 print.cpp #include "print.h

Acquisition0818的博客 4338

LSTM在DNA序列分析中的应用:生物信息学的探索

长短期记忆网络(LSTM)是循环神经网络(RNN)的一个变种,旨在解决RNN在长序列数据中出现的梯度消失和梯度爆炸问题。LSTM通过引入“记忆单元”和三个门(输入门、遗忘门和输出门)来有效捕捉长距离依赖关系。这使得LSTM在处理DNA序列等时间序列数据时具有优势。LSTM在DNA序列分析中展现了强大的能力,能够捕捉复杂的序列特征,并提供高效的解决方案。本文从LSTM的基本原理、DNA序列特性、模型构建、训练过程到实际应用进行了详细阐述。

斌擎科技 748

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

vscode多文件编译构建(CMake)和调试C++

本博客聚焦于在VS Code环境下使用CMake进行项目的构建与调试。先介绍CMake作为跨平台构建系统生成器,通过CMakeLists.txt文件描述构建流程。接着阐述tasks.json文件的配置,包括任务类型、命令、依赖关系等关键字段含义;launch.json配置则关乎调试设置,详细说明各字段作用。对CMakeLists.txt中的关键设置如调试标志配置也做了详解。还展示了构建项目全过程,包括操作步骤、文件夹内容及断点调试方法,助你在VS Code高效开发调试项目。

cuber膜拜的博客 4130

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: CMake使用详解一(单文件编译)
下一篇: Mathpix图片转LaTeX,Word快速插入LaTeX公式教程
刘凯KAI
博客等级 码龄15年 663粉丝 128原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值