本文介绍使用make调用tcc编译lua解释器过程,感觉在win下使用make的教程好少啊。
1 基本格式
Makefile的基本格式如下,简单理解是生成[目标],如果[目标]文件存在,则不运行该编译命令,如果[目标]文件不存在,则检查[依赖…],如果依赖存在则直接执行[编译指令],若依赖不存在,则调用依赖文件编译命令,以此类推。
[目标]:[依赖...][编译指令...]
简单例子如下:
#编译lua解释器
#标签,编译目标为lua.exe执行文件
#下面接编译指令,注意编译指令前面又加一个tab键,不能加空格.
lua.exe:rem 注释,编译指令tcc *.c -o lua.exeecho 编译成功
输入下面指令即可执行
::不输入其他参数,即直接执行第一个编译[目标]文件
make
::等价于下面命令,即生产lua.exe可执行文件
make lua.exe
::若此前已生成过lua.exe文件,则会显示make: 'lua.exe' is up to date.
::即已经存在编译目标,相关指令不会运行,需先del lua.exe删除文件
2 多个编译选项
使用make一个主要目的就是使用单独一个Makefile文件提供多个编译选项,若使用批处理命令,提供类似的功能,但是比较复杂需要编写编译逻辑。下面将前文编译lua的过程写成Makefile脚本
# 编译lua解释器的Makefile# 定义变量other_c,用于静态链接和动态链接
other_c = lapi.c lcode.c lctype.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c ltable.c ltm.c lundump.c lvm.c lzio.c lauxlib.c lbaselib.c lcorolib.c ldblib.c liolib.c lmathlib.c loslib.c lstrlib.c ltablib.c loadlib.c linit.c lutf8lib.c# 编译lua.exe文件,默认指令,调用[link]编译指令
# 无论当前目录下是否存在lua.exe文件,均可重新进行编译
build:linkecho 生成lua.exe成功!# 编译lua.exe文件
# 若当前目录下有lua.exe文件,则不会编译
lua.exe:tcc -c *.ctcc *.o -o lua.exe# 运行lua.exe程序
# 当lua.exe未编译,会先调用[lua.exe]指令生成lua.exe
run:lua.exe.\lua.exe#只编译,生成obj文件
compile:tcc -c *.cecho 编译成功!# 进行链接,会先调用[compile]指令
link:compiletcc *.o -o lua.exeecho 链接成功!# 生成静态链接库并生成lua.exe,使用到变量other_c
lib:tcc -r $(other_c) -o liblua.atcc liblua.a lua.c -o lua.exeecho 生成静态链接库并生成lua.exe# 生成动态链接库并生成lua.exe,使用到变量other_c
dll:tcc $(other_c) -shared -rdynamic -o lua.dlltcc lua.def lua.c -o lua.exeecho 生成动态链接库并生成lua.exe# 显示lua的版本
v:lua.exe.\lua.exe -v# 清除所有编译产生的文件
clean:if exist lua.exe del lua.exeif exist *.o del *.oif exist liblua.a del liblua.aif exist lua.dll del lua.dllif exist lua.def del lua.def
3 参考
Makefile入门(超详细一文读懂)-CSDN博客
https://blog.csdn.net/ZBraveHeart/article/details/123187908
GNU Make Manual - GNU Project - Free Software Foundation
https://www.gnu.org/software/make/manual/