写在前头
2024-04-14
参考资料:
部分文稿照片参考了 YouTube 上这个视频
https://youtu.be/HfzPFniCnHw?si=mUPuHwpBuC0O7cn2
xmake 快速上手直接看这篇:
https://tboox.org/cn/2018/03/26/build-project-so-simply/
上手 makefile 看,yushiqi 老师的:
【Makefile 20分钟入门,简简单单,展示如何使用Makefile管理和编译C++代码】 https://www.bilibili.com/video/BV188411L7d2/?share_source=copy_web&vd_source=59d47afd43812c161ca8ef67a1dfea4d
可以配合我的视频阅读本文:
1.make 工具
为什么要使用 make?
make 不是 compiler,
make 自动化编译,emm,平时练习我们写的文件很少,可能就一个 source 文件,一个 header 文件,使用 gcc 编译的时候也不麻烦,要是有几十个、几百个文件的时候怎么办?你手动一个个敲入不是很麻烦,那就可以使用 make 来搞,就是快。再看下面的特性,每次修改只重新编译修改的文件,这也是提高效率的一个良好特性。
make 是一个工具,make 工作要使用 makefile,makefile 就是一个描述文件,一组规则给我 make 你要信息在这里面,按照 makefile 里面描述的,你去干活。
下面通过一个例子来学习 make 和 makefile,内容是由 Gemini 实现:
https://g.co/gemini/share/9e37c201fa23
卡了一段时间的 bug,退出代码:255
解决方案:就是 xmake.lua
文件写的有问题,语法的问题,这一点 AI 工具很不靠谱。
就是 gcc 每次重新编译,费时间。当文件超级多的时候,编译是恐怖的。
看一段简单的 Makefile 文件:
2.xmke 舒服
https://xmake.io/#/zh-cn/about/course
上面这是付费视频课
在询问 通义千问和 Gemini 的时候,给我 lua 脚本都有问题,然后在 zhihu 找到 xmake 开发者搞的一个 bot:
https://www.doubao.com/bot/HZihPuY6
这个是字节火山引擎下的云雀大模型的 bot,询问 xmake 相关问题还是比较准确的。
二更:说实话启其实也不准确。
还是这个问题,然后搞一个小工程 cin-with-keyboard
https://g.co/gemini/share/9e37c201fa23
甚至不需要去专门学习 xmake.lua
的语法,直接快速上手:
// 一键生成一个模板工程
xmake create xxx
// 而后替换 scr里面的文件
cd test/src/
//,修改lua文件里的文件名称即可
xmake
// clean 一下
xmake clean
add_rules("mode.debug", "mode.release")
target("test")
set_kind("binary")
add_files("src/*.c")
add_headerfiles("src/*.h")
--
-- I
整个工程文件如下所示:
3.Makefile 编写
https://tongyi.aliyun.com/qianwen/share?shareId=73bd9411-aada-4a1e-b14a-4048ad0e1486
【Makefile 20分钟入门,简简单单,展示如何使用Makefile管理和编译C++代码】 【精准空降到 13:29】 https://www.bilibili.com/video/BV188411L7d2/?share_source=copy_web&vd_source=59d47afd43812c161ca8ef67a1dfea4d&t=809
在 v4 Makefile 里面引入了两个函数,以下为解释;
# 源文件
SRC = $(wildcard *.c)
OBJ = $(patsubst %.c, %.o, $(SRC))
https://tongyi.aliyun.com/qianwen/share?shareId=3b12901c-c9aa-48dc-b9c6-061d3a66531f
- $(wildcard pattern)是一个Makefile函数,用于返回与模式匹配的所有文件名。
- $(patsubst pattern, replacement, text)是一个Makefile函数,用于将文本中的模式替换为替换字符串。
在Makefile中,%和$都有特定的含义和用途。
- %:percentage 在Makefile中,%是一个通配符,用于匹配一个或多个字符。它通常用于模式规则中,表示一个或多个任意字符。例如,%.o: %.cpp表示所有的.o文件都依赖于相应的.cpp文件。%符号左边的字符表示匹配的前缀,右边的字符表示匹配的后缀。
- $:在Makefile中,$用于引用变量、函数等。例如,$@表示目标文件,$<表示第一个依赖项,$(wildcard pattern)表示返回与模式匹配的所有文件名。$符号后面跟一个字母或数字表示一个变量,例如$(SRC)表示名为SRC的变量的值。$()表示一个函数,例如$(wildcard pattern)表示返回与模式匹配的所有文件名。
总之,%和$都是Makefile中的特殊符号,分别用于匹配和引用。它们使得Makefile更加灵活和强大,能够处理各种复杂的编译任务。
4.make 和 xmake 写法对比
将第4版Makefile文件作为一个模板使用:
# 指定编译器
CXX = gcc
# 指定编译标志 -Wall is means warning all
CXXFLAGS = -Wall -g
# 目标文件
TARGET = main
# 源文件
SRC = $(wildcard *.c)
OBJ = $(patsubst %.c, %.o, $(SRC))
#OBJ = main.c.o calcu.c.o input.c.o
# 生成目标文件的规则
# TARAGET 依赖于 OBJ
$(TARGET): $(OBJ)
$(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJ)
# # 有一个问题:这里不需要添加.h文件吗?
# main.o: main.c
# $(CXX) $(CXXFLAGS) -c main.c
# calcu.o: calcu.c
# $(CXX) $(CXXFLAGS) -c calcu.c
# input.o: input.c
# $(CXX) $(CXXFLAGS) -c input.c
# 上述规则的命令行表示 $@ 代表目标文件TARGET,$^ 代表所有依赖文件OBJ
$(CXX) -o $@ $^
# 此条将每个.c文件生成.o文件的规则,用来简化每次将.c文件编译成.o文件的命令 Line19-26
%.o: %.c
$(CXX) $(CXXFLAGS) -c $< -o $@
# 清理规则
# 避免歧义,.PHONY声明clean是一个伪目标,不是文件
.PHONY: clean
clean:
rm -f $(TARGET)
rm -f $(OBJ)
同此,给出xmake-lua的最终代码:
-- 设置目标
target("myprogram")
-- 设置目标类型为二进制
set_kind("binary")
-- 添加所有.c文件
add_files("src/*.c")
-- 添加编译标志
add_cxflags("-Wall", "-g")
-- 清理规则
after_clean(function ()
-- 删除目标文件和所有.o文件
os.rm("main")
os.rm("*.o")
end)
暂无评论