make(Makefile)与xmake(xmake-lua)

写在前头

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?

img

make 不是 compiler,

make 自动化编译,emm,平时练习我们写的文件很少,可能就一个 source 文件,一个 header 文件,使用 gcc 编译的时候也不麻烦,要是有几十个、几百个文件的时候怎么办?你手动一个个敲入不是很麻烦,那就可以使用 make 来搞,就是快。再看下面的特性,每次修改只重新编译修改的文件,这也是提高效率的一个良好特性。

img

make 是一个工具,make 工作要使用 makefile,makefile 就是一个描述文件,一组规则给我 make 你要信息在这里面,按照 makefile 里面描述的,你去干活。

下面通过一个例子来学习 make 和 makefile,内容是由 Gemini 实现:

https://g.co/gemini/share/9e37c201fa23

卡了一段时间的 bug,退出代码:255

解决方案:就是 xmake.lua文件写的有问题,语法的问题,这一点 AI 工具很不靠谱。

img

就是 gcc 每次重新编译,费时间。当文件超级多的时候,编译是恐怖的。

看一段简单的 Makefile 文件:

img

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

img

甚至不需要去专门学习 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

整个工程文件如下所示:

img

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中,%和$都有特定的含义和用途。

  1. %:percentage 在Makefile中,%是一个通配符,用于匹配一个或多个字符。它通常用于模式规则中,表示一个或多个任意字符。例如,%.o: %.cpp表示所有的.o文件都依赖于相应的.cpp文件。%符号左边的字符表示匹配的前缀,右边的字符表示匹配的后缀。
  2. $:在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)

相关推荐

intel 8086 asm 基础1

1.进入debug模式 r 查看 2. mov指令测试 指令以CS:IP 格式进行读取,后跟8086 asm实 ...

暂无评论

发表评论

您的电子邮件地址不会被公开,必填项已用*标注。