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更换为.o

EXEC := 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=address

SRC = 
OBJ = $(SRC:.cc=.o)
EXEC = main

all: $(EXEC)

$(EXEC): $(OBJ)
	$(CXX) $(LDFLAGS) -o $@ $(OBJ) $(LBLIBS)

clean:
	rm -rf $(OBJ) $(EXEC)

之后根据需要进行调整.


总结

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

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


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


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用键盘管理器更改键盘快捷键,让键盘真正迎合你的使用习惯

如果默认快捷键不适合你&#xff0c;你肯定会想知道如何在Windows 11中更改键盘快捷键。 也许你已经习惯了macOS键盘&#xff0c;或者像我一样在Windows和Mac之间切换工作/游戏——如果是这样的话&#xff0c;重新配置默认的Windows快捷方式&#xff0c;使其与Mac上的快捷方式…

双11背后的中国云厂商:新“标准化”,和调整后的新韧性

降价并不代表一味的压缩自身利润空间&#xff0c;云厂商已经开始向具有更高利润空间的PaaS、SaaS产品腾挪&#xff0c;核心产品在总包占比越来越高。 作者|斗斗 编辑|皮爷 出品|产业家 今年云厂商&#xff0c;全面拥抱双11。 作为中国最大的云计算服务提供商&#xff0…

释放搜索潜力:基于Milvus快速搭建语义检索系统(快速版),让信息尽在掌握

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

完蛋! 我被MySQL索引失效包围了!

前言 一阵熟悉的起床闹钟响起&#xff0c;小菜同学醒来竟发现周围都是导致索引失效的原因&#xff1a;性感迷人的索引使用不当、可爱活泼的存储引擎无法识别索引列、刁蛮任性的优化器不选择索引... 知其然更要知其所以然&#xff0c;一起来看看索引为啥失效了吧~ 在阅读文本…

零基础安装分布式数据服务注册系统

一、先安装VM虚拟机&#xff0c;安装最新的ubuntu22系统&#xff0c; 先安装mysql&#xff0c; sudo apt install mysql-server sudo mysql_secure_installation 根据自己需求选择 密码安全级别时&#xff0c;选择n 删除匿名用户&#xff1f;&#xff08;按y|Y表示是&…

【加载自定义数据csv/image】HuggingFace的datasets库中load_dataset

1.加载自定义数据 load_dataset有以下参数&#xff0c;具体可参考 源码 def load_dataset(path: str,name: Optional[str] None,data_dir: Optional[str] None,data_files: Union[Dict, List] None,split: Optional[Union[str, Split]] None,cache_dir: Optional[str] No…

UE基础篇十一:Sequencer

导语: 视频文档在文末 知识点记录: 1、创建Sequence 2、动画可以设置权重值 作动画过渡 3、摄像机 可以设置追踪目标 调整一些摄像机参数等 4、在曲线编辑中编辑可以更详细调整路径 5、在一个序列中 添加添加另一个序列文件

git commit 后 发现提交信息写错了怎么办

解决方案&#xff1a; 可以使用 git commit --amend 命令。此命令将打开默认文本编辑器&#xff0c;允许你编辑最近的提交的提交信息。 以下是使用 git commit --amend 的步骤&#xff1a; 首先&#xff0c;在你的工作目录中进行所需的更改。运行 git add 命令将更改的文件添…

恒驰喜讯 | 荣获2023项目管理论坛“最佳集成服务伙伴”、“卓越合作伙伴项目经理”双奖

2023年11月7日~8日&#xff0c;以“价值交付共创未来”为主题的2023年项目管理论坛在深圳坂田成功举办。论坛上&#xff0c;来自海内外交付领域的200多名专家围绕项目管理实践、交付案例与项目优化等主题展开了深入交流&#xff0c;并就各区域项目管理案例做了经验分享&#xf…

ubuntu20.04.6安装Intel AX211网卡驱动

前言 环境&#xff1a; ThinkBook16 2023 款网卡Intel AX211 Wi-Fi6ubuntu版本20.04.6&#xff08;最后一位小数很重要&#xff09;系统内核 Linux wzy 5.15.0-67-generic #74~20.04.1-Ubuntu SMP Wed Feb 22 14:52:34 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux 方法&#x…

分布式事务 - seata安装

分布式事务 - seata 一、本地事务与分布式事务 1.1、本地事务 本地事务&#xff0c;也就是传统的单机事务。在传统数据库事务中&#xff0c;必须要满足四个原则&#xff08;ACID&#xff09;。 1.2、分布式事务 分布式事务&#xff0c;就是指不是在单个服务或单个数据库架构…

粉够荣获淘宝联盟理事会常务理事,共绘联盟生态新篇章

淘宝联盟区域理事会于2021年成立&#xff0c;首届成立成都、广州、武汉&#xff0c;服务近2000个领军淘宝客企业&#xff0c;作为区域生态与官方交流重要枢纽&#xff0c;理事会举办近百场交流分享会&#xff0c;带动淘客跨域跨业态交流成长。 2023年9月7日第二届淘宝联盟理事…

React实战项⽬开发完整流程含代码

React实战演练项⽬一需求分析及项目初始化 需求分析 刚学完React,开始找项目进行上手练习&#xff01; 页面组件拆分&#xff1a; 头部&#xff1a;导航tab、搜索框、登录注册 中间&#xff1a;分类导航、轮播图、新人福利、高单价产品导航 课程分类列表、底部内容、登陆提…

MinIO实现数据迁移(mc)

运行两个版本的minio version: 2.3 services: # 新版本 minio2023: image: minio/minio:RELEASE.2022-06-20T23-13-45Z.fips container_name: minio2023 restart: always environment: - MINIO_ACCESS_KEYminioadmin - MINIO_SECRET_KEYminioadmin - MINIO_ROOT_USERminioadm…

为什么要使用动态代理IP?数据采集使用动态代理有哪些优势?

随着互联网的普及&#xff0c;数据采集已经成为企业、营销人员和数据分析师的重要工作之一。然而&#xff0c;在采集数据的过程中&#xff0c;经常会遇到一些问题&#xff0c;如IP被封禁、访问受限等。为了解决这些问题&#xff0c;动态代理IP应运而生。那么&#xff0c;为什么…

TP-LINK联洲面试题

文章目录 1.说一下微服务架构?2.微服务优缺点3.负载均衡的实现算法4.Redis集群部署方式?5.MySQL主从复制?5.1 配置流程5.2 优缺点分析6.口头手撕快排7.队列实现栈和栈实现队列7.1 队列实现栈7.2 栈实现队列8.进程有几种状态?9.Spring Boot Actuator?10.外键、主键和索引?…

数字化转型具体包含哪些内容?

数字化转型是一个广泛且多方面的过程&#xff0c;涉及将数字技术集成到组织或企业的各个方面&#xff0c;从根本上改变其运营和交付价值的方式。它包含广泛的活动、战略和举措&#xff0c;这些活动、战略和举措可能会根据组织的具体目标和需求而有所不同。以下是数字化转型的一…

谁家分析数据还要开发啊,不都一键得报表吗?

点击导入数据&#xff0c;再回来BI系统已经把近百张数据分析报表放在眼前了&#xff0c;每月都要计算分析的指标有了&#xff0c;领导要的数据分析有了&#xff0c;自己要的业绩分析也有了&#xff0c;甚至自己没想到的一些分析主题&#xff0c;它也贴心地做好了。有这样一套BI…