2023-11-17 VsCode使用makefile进行多文件编译


点击 <C 语言编程核心突破> 快速C语言入门


VsCode使用makefile进行多文件编译

  • 前言
  • 一、一个简单的多文件示例
  • 二、makefile基本语法
  • 三、VsCode使用makefile
  • 总结


前言

要解决问题: C或C++可以多文件编译, 意味着需要进行代码组织, 为了方便多文件编译, gnu开发了make工具, 但问题是这简直又是一种编程语言, 为了解决一个问题, 又产生另一个问题. 在一个问题回答中, 我了解了作为新手的我们, 对make是如此困惑.

想到的思路: 从一个最简单的多文件编译, 简述makefile的编写, 组织C文件.

其它的补充: 需要更系统的学习, 可以查看陈皓巨佬的相关文章<跟我一起写makefile>.


一、一个简单的多文件示例

一个问题, makefile文件中VPATH路径无法找到, 本来十分简单, 但回答搞得可说乱七八糟, 可以想见, 大家对makefile是如此的不熟悉,

一个有三个文件夹, 若干个.c文件的小项目, 要用makefile组织编译, 我根据这个题目, 模拟了一下:

项目文件

三个文件夹, 分别有一个c文件, 可能含有一个头文件, 文件的名称和文件夹的名称是一致的, 当然也可以不一致, 这没有关系.

现在编写makefile, 将上述文件夹中的所有文件组织为一个名为main的可执行程序.

二、makefile基本语法

既然是用于编译, makefile自然需要提供一些信息, 包括:

  1. 编译器, 一般是gcc, 或clang
  2. 目录信息, 让make自动寻找文件, 省的手动一个个设置
  3. 源文件名
  4. 最终编译出来的目标
  5. 编译依赖的文件
  6. 执行模板
  7. 如果头文件和源文件不在一起, 需指定头文件夹位置
  8. 如果需要引入库文件, 则需要指定库文件夹位置, 以及库文件

下面就是一个编写好的makefile, 用于处理我们上面提到的多文件编译, 大家先看一下.

CC := clang #编译器VPATH := IO_tools menu shapes #自动寻找的目录SRC := IO_tools.c menu.c shapes.c #源文件OBJ := $(SRC:.c=.o) #目标文件, 由.c更换为.oEXEC := main #执行文件all: $(EXEC) #目标all, 依赖main$(EXEC): $(OBJ) #main依赖.o文件, $^是所有依赖文件 $@是目标文件$(CC) $^ -o $@%.o: %.c #将所有的.c文件编译为.o文件, $<是第一个依赖文件, -c是生成.o文件$(CC) -c $< -o $@clean:rm -rf $(OBJ) $(EXEC)
#E:\msys64\clang64\bin\mingw32-make.exe all -f E:\clangC++\answer\C\make\Makefile -C E:\clangC++\answer\C\make\

由于只是基础普及, 示例没有放函数等复杂应用, 对于小项目, 这个就基本够了.

我们一条一条说:

首先是变量赋值, 很遗憾, 你必须将makefile语法当成一门编程语言, 因为这样比较好理解.

CC一般是编译器变量名, :=带冒号的赋值符号意味着非递归赋值, 也就是现在赋值是啥就是啥.

不带冒号的赋值, 则可能涉及递归, 这个不阐述, 暂时用不到.

我们给CC赋值为clang, 用clang进行编译.

VPATH是一个特殊变量, 代表make要搜寻的文件夹, 我们将需要编译的文件所在文件夹IO_tools menu shapes赋值给它.

然后make会帮我们在这些文件夹中寻找我们要编译的源文件.

SCR这个变量, 我们给它赋值为所有需要编译的源文件IO_tools.c menu.c shapes.c

OBJ这个变量, 我们给他赋值为源文件编译后的.o文件, 也就是还未链接的中间文件.

$(SRC:.c=.o)大家看, 这是一个变量引用的语法, 它引用变量SRC, 需要用$()括号将变量包裹,

.c=.o这个操作, 是将SRC中的.c结尾变成.o结尾, 于是OBJ就应该是IO_tools.o menu.o shapes.o

EXEC := main这句很好懂, 就是最终的可执行文件EXEC的名字叫main

all: $(EXEC) 这一句是makefile的精髓, 意思很简单, 生成的目标叫all, 这也是默认最终目标, 它依赖变量EXEC也就是main

然后递归, main现在作为目标, 又需要OBJ这些文件来链接, 于是就有$(EXEC): $(OBJ)这个语句.

注意, 下面是执行编译命令模板, $(CC) $^ -o $@这个前面空白必须是一个tab符号, 否则无法编译, 这句命令的意思是

clang IO_tools.o menu.o shapes.o -o main 这就是模板完成的语句, 我们说明一下

$(CC) 是编译器, 我们这里就是clang , 这个符号$^代表所有依赖项, 也就是所有的.o文件, 这个 -o是编译选项, 输出编译结果名 , 这个符号$@是目标项, 也就是main

将所有模板扩充之后就是我们的编译命令行.

之后继续递归, %.o: %.c, 所有.o文件依赖对应的.c文件, 这里的百分号%是一个识别模式,

代表在makefile文件中查找所有前面可以是任意字符组成, 最后必须是.o的文件名, 除了后缀不同, 目标和依赖这两个文件的名字是一致的.

将所有的.c文件编译为.o文件, $<是第一个依赖文件, -c是生成.o文件

$(CC) -c $< -o $@是编译命令模板, -c是编译但不链接, 这个符号$<是依赖的第一项, 也就是.c文件,

因为一对一对应, 所以没必要用全部依赖. 这个模板扩展之后, 是三个编译命令行, 如clang -c menu/menu.c -o menu.o,

注意, 因为我们使用了VPATH这个变量, make自动帮我们查找.c文件的路径, 并补全,

但开头提到的makefile文件中VPATH路径无法找到, 问题就在于不是使用模板编译命令, 而是直接写死了命令行, 导致VPATH这个设置无法使用.

最后是clean:, 这是删除所有生成的文件, 包括中间文件以及最终的可执行文件.

rm -rf $(OBJ) $(EXEC) 这是执行语句, 记住前面必须是tab, rm -rf这个是大家熟悉的Linux命令, 强制删除文件夹及文件.

三、VsCode使用makefile

为了在vscode中方便使用makefile组织项目, 可以下载插件, 微软官方的VS Code Makefile Tools, 编写makefile后可以一件运行, 以及生成各种子目标.

make tools

以及Makefile-Creator作者是Antoine aka. Zenor, 可以通过右键文件夹, 自动生成makefile模板.
在这里插入图片描述

CXX = g++
CXXFLAGS = -Wall -Werror -Wextra -pedantic -std=c++17 -g -fsanitize=address
LDFLAGS =  -fsanitize=addressSRC = 
OBJ = $(SRC:.cc=.o)
EXEC = mainall: $(EXEC)$(EXEC): $(OBJ)$(CXX) $(LDFLAGS) -o $@ $(OBJ) $(LBLIBS)clean:rm -rf $(OBJ) $(EXEC)

之后根据需要进行调整.


总结

到这里, 基础普及知识就完成了, 对于小项目, 可以说基本能覆盖百分之八十了, 大项目, 还是自己去学吧, 网上的内容很多, 推荐开头说的陈皓巨佬的文章, 我们十分怀念这位前辈, 他所留下的文字, 始终指引着一批批程序员.

最后, 如果你觉得makefile很麻烦, 可以看看xmake, 这个国产的项目工具, 一定能找到惊喜.


点击 <C 语言编程核心突破> 快速C语言入门


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/146771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2018年五一杯数学建模A题徐州潘安湖风景区游览路线设计解题全过程文档及程序

2019年五一杯数学建模 A题 徐州潘安湖风景区游览路线设计 原题再现 徐州是一个老工业基地和资源型城市&#xff0c;煤炭开采历史长达130年。长期煤炭开采在徐州累计形成采煤塌陷区达数十万亩。位于徐州市贾汪区西南部、紧邻马庄的潘安湖湿地公园原来就是徐州最大的、塌陷最严…

实验六:Android的网络编程基础

实验六&#xff1a;Android 的网络编程基础 6.1 实验目的 本次实验的目的是让大家熟悉 Android 开发中的如何获取天气预报&#xff0c;包括了 解和熟悉 WebView、WebService 使用、网络编程事件处理等内容。 6.2 实验要求 熟悉和掌握 WebView 使用 了解 Android 的网络编程…

Hadoop学习总结(MapRdeuce的词频统计)

MapRdeuce编程示例——词频统计 一、MapRdeuce的词频统计的过程 二、编程过程 1、Mapper 组件 WordcountMapper.java package com.itcast.mrdemo;import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; …

网站页头被挂马状态及新增了index.html文件解决思路

今天网站刚新增了篇了文章《从nginx层阻断可执行的php 防止宝塔站点挂马》,整体测试下来还是不靠谱,设置后导致所有PHP文件都打不开了。 经过不断的查看日志和搜索办法总算告一段落,后续待观察。原因如下,多个网站目录新增了index.html文件,看时间是近两天上传的。 网站代…

微信小程序动态生成表单来啦!你再也不需要手写表单了!

dc-vant-form 由于我们在小程序上涉及到数据采集业务&#xff0c;需要经常使用表单&#xff0c;微信小程序的表单使用起来非常麻烦&#xff0c;数据和表单是分离的&#xff0c;每个输入框都需要做数据处理才能实现响应式数据&#xff0c;所以我开发了dc-vant-form&#xff0c;…

【开源】基于Vue.js的社区买菜系统的设计和实现

项目编号&#xff1a; S 011 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S011&#xff0c;文末获取源码。} 项目编号&#xff1a;S011&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 数据中心模块2.1…

【uniapp】 video视频层级、遮挡其他弹窗或顶部导航 使用nvue覆盖

uniapp 顶部导航和弹窗被video遮挡解决办法 第一步&#xff1a;配置 subNVues {"path": "pages/index/index","style": {"navigationBarTitleText": "uni-app","navigationStyle": "custom","app-…

对话芯动科技 | 助力云游戏 4K级服务器显卡的探索与创新

2021年芯动科技推出了基于IMG BXT GPU IP的风华1号显卡。单块风华1号显卡可在台式机和云游戏中实现4K级别的性能&#xff0c;渲染能力达到5 TFLOPS&#xff0c;如果在服务器中同时运行两块显卡&#xff0c;性能还可翻倍。该显卡是为不断扩大的安卓云游戏市场量身定制的&#xf…

隐私协议 Secret Network 宣布使用 Octopus Network 构建的 NEAR-IBC 连接 NEAR 生态

2023年11月 NearCon2023 活动期间&#xff0c;基于 Cosmos SDK 构建的隐私协议 Secret Network&#xff0c;宣布使用 Octopus Network 开发的 NEAR-IBC&#xff0c;于2024年第一季度实现 Secret Network 与 NEAR Protocol 之间的跨链交互。 这将会是Cosmos 生态与 NEAR 之间的首…

[C国演义] 哈希的使用和开闭散列的模拟实现

哈希的使用和开闭散列的模拟实现 1. 使用1.1 unordered_map的接口1.2 unordered_set的接口 2. 哈希底层2.1 概念2.2 解决哈希冲突 3. 实现3.1 开放寻址法3.2 拉链法 1. 使用 1.1 unordered_map的接口 构造 void test1() {// 空的unordered_map对象unordered_map<int, in…

动态头像如何制作?这个方法请收藏

照片是记录生活的一种方式&#xff0c;但是静态图片有时候不能够完全表达我们的情感。而动态的图片能够让图片以更生动的方式来展示我们的想象力和内心情感。那么&#xff0c;大家知道动态图片制作的方法有哪些吗&#xff1f;使用gif动画制作&#xff08;https://www.gif.cn/&a…

React项目首页中用canvas实现星空

文章目录 前言代码使用后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;前端系列文章 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&#xff0c;感谢大家…

机器学习笔记 - 隐马尔可夫模型的简述

隐马尔可夫模型是一个并不复杂的数学模型,到目前为止,它一直被认为是解决大多数自然语言处理问题最为快速、有效的方法。它成功地解决了复杂的语音识别、机器翻译等问题。看完这些复杂的问题是如何通过简单的模型得到描述和解决,我们会由衷地感叹数学模型之妙。 人类信息交流…

数据结构与算法设计分析——常用搜索算法

目录 一、穷举搜索二、图的遍历算法&#xff08;一&#xff09;深度优先搜索&#xff08;DFS&#xff09;&#xff08;二&#xff09;广度优先搜索&#xff08;BFS&#xff09; 三、回溯法&#xff08;一&#xff09;回溯法的定义&#xff08;二&#xff09;回溯法的应用 四、分…

EfficientNet:通过模型效率彻底改变深度学习

一、介绍 EfficientNet 是深度学习领域的里程碑&#xff0c;代表了神经网络架构方法的范式转变。EfficientNet 由 Google Research 的 Mingxing Tan 和 Quoc V. Le 开发&#xff0c;在不影响性能的情况下满足了对计算高效模型不断增长的需求。本文深入探讨了 EfficientNet 背后…

百度搜索智能化算力调控分配方法

作者 | 泰来 导读 随着近年深度学习技术的发展&#xff0c;搜索算法复杂度不断上升&#xff0c;算力供给需求出现了爆发式的增长。伴随着AI技术逐步走到深水区&#xff0c;算法红利在逐步消失&#xff0c;边际效应日益显著&#xff0c;算力效能的提升尤为重要&#xff0c;同时随…

视频修复软件 Aiseesoft Video Repair mac中文版功能

AIseesoft Video RepAIr mac是一款专业的视频修复软件&#xff0c;主要用于修复损坏或无法播放的视频文件。AIseesoft Video RepAIr是一个功能强大的程序,可以帮助恢复丢失或损坏的数据的视频。只要您以相同的格式提供示例视频,并在功能强大的技术的支持下,只需单击几下即可收获…

智能配电系统解决方案

智能配电系统解决方案是一种集成了先进技术和智能化功能的配电系统&#xff0c;它能够提高电力系统的效率、可靠性和安全性。力安科技智能配电系统解决方案依托电易云-智慧电力物联网&#xff0c;具体实施的方案如下&#xff1a; 智能化设备和传感器&#xff1a;采用智能化的开…

「Java开发指南」如何在Spring中使用JAX-WS注释器?

本文将指导您如何使用JAX-WS注释器从Spring服务生成JAX-WS Web服务&#xff0c;在本教程中&#xff0c;您将学习如何&#xff1a; 为Spring服务启用JAX-WS部署应用程序并测试服务 所有与Spring scaffolding相关的任务都需要MyEclipse Spring或Bling授权。 MyEclipse v2023.1…

MapApp 地图应用

1. 简述 1.1 重点 1&#xff09;更好地理解 MVVM 架构 2&#xff09;更轻松地使用 SwiftUI 框架、对齐、动画和转换 1.2 资源下载地址: Swiftful-Thinking:https://www.swiftful-thinking.com/downloads 1.3 项目结构图: 1.4 图片、颜色资源文件图: 1.5 启动图片配置图: 2. Mo…