tcc编译器教程7 为编译gmake编写Makefile文件

news/2025/3/13 7:15:36/

本文介绍如何为编译gmake编写Makefile文件

1 编写Makefile

根据前面所学内容编写Makefile如下,基本与前面所写的lua解释器的Makefile文件用法相同.注意生成文件为tcc-make.exe,除了名称有点差异,其他与前面生成make.exe完全相同。

# 编译gmake的Makefile# make_name为生成程序的名称,可在批处理中进行设置
# 当没有设置make_name的值时,将make_name设置为tcc-make.exe
# 之所以不将将make_name设为make.exe,因为make.exe无法对make.exe进行处理
make_name ?= tcc-make.exe#设置警告信息和包含路径
include = -Wall -I src -I lib -I src/w32/include#设置编译常量
define = -D GMAKE_FOR_BUSYBOX  -D WINDOWS32 -D HAVE_CONFIG_H -D HAVE_STDINT_H -D HAVE_STRNICMP -D HAVE_UMASK -D WIN32_LEAN_AND_MEAN= -D ftruncate=_chsize -D _cdecl=#设置编译c代码路径,注意\*需写为\\*
src = lib\\*.c src\\*.c src\w32\\*.c src\w32\compat\\*.c src\w32\subproc\\*.c#设置链接库
lib = -luser32 -ladvapi32# 编译tcc-make.exe文件,默认指令,调用[link]编译指令
# 无论当前目录下是否存在tcc-make.exe文件,均可重新进行编译
build:link@rem 注释@echo 生成$(make_name)成功!# 编译tcc-make.exe文件
# 若当前目录下有tcc-make.exe文件,则不会编译
$(make_name):@tcc $(include) $(define) $(src) $(lib)  -o $(make_name)@echo 生成$(make_name)成功!#只编译,生成obj文件
compile:@rem 编译主要源码@tcc -c $(include) $(define) src\\*.c@rem 将main.o移动到lib目录下,主要为了后面编译静态库move main.o lib\main.o@rem 将misc.o重命名为misc1.o@rem 这步很关键,因为后面src\w32\subproc\misc.c也会编译为misc.o,导致这个misc.o被覆盖从而无法编译@move misc.o misc1.o@rem 编译其他源码@tcc -c $(include) $(define) lib\\*.c@tcc -c $(include) $(define) src\w32\\*.c@tcc -c $(include) $(define) src\w32\compat\\*.c@tcc -c $(include) $(define) src\w32\subproc\\*.c@echo 编译成功!# 进行链接,会先调用[compile]指令
link:compile@rem 对所有obj文件进行链接生成tcc-make.exe@tcc lib\main.o *.o $(lib) -o $(make_name)@echo 链接成功!# 生成静态链接库并生成tcc-make.exe
lib:compile@rem  生成静态链接库libmake.a@tcc -r  *.o  -o libmake.a@rem 使用静态链接库进行链接生成tcc-make.exe@tcc lib\main.o libmake.a $(lib) -o $(make_name)@echo 生成静态链接库并生成$(make_name)# 生成动态链接库并生成tcc-make.exe
dll:compile@rem 生成动态链接库make.dll@rem 注意需包含lib\main.o@tcc -shared -rdynamic lib\main.o *.o $(lib) -o make.dll@rem 只需make.def,不需要lib\main.o@tcc  make.def  -o $(make_name)@echo 生成动态链接库并生成$(make_name)# 显示tcc-make.exe的版本
v:$(make_name)@.\$(make_name) -v# 清除所有编译产生的文件
clean:@if exist $(make_name) del $(make_name)@if exist *.o del *.o@if exist lib\main.o del lib\main.o@if exist libmake.a del libmake.a@if exist make.dll del make.dll@if exist make.def del make.def@echo 清除所有编译产生的文件成功# 帮助
help:@echo   ------------------------------------@echo 这是一个使用tcc编译$(make_name)的Makefile脚本,具体用法如下@echo     make-生成直接生成$(make_name)@echo     make build-生成直接生成$(make_name)@echo     make lua.exe-若没有$(make_name)生成$(make_name)@echo     make run-运行$(make_name)@echo     make compile-编译所有c代码@echo     make link-链接所有c代码@echo     make lib-生成静态链接库并生成$(make_name)@echo     make dll-生成动态链接库并生成$(make_name)@echo     make clean-清除所有编译文件@echo     make v-显示$(make_name)版本@echo     中文用法见make 帮助@echo ------------------------------------# 中文化选项
# 实际上主要依靠执行依赖项build,编译指令为空指令
构建:build@rem
运行:run@rem
编译:compile@rem
链接:link@rem
静态:lib@rem
动态:dll@rem
清除:clean@rem
版本:v@rem
帮助:@echo   ------------------------------------@echo 这是一个使用tcc编译$(make_name)的Makefile脚本@echo   下面主要介绍中文指令用法,英文用法见make help@echo     make 构建-生成直接生成$(make_name)@echo     make 运行-运行$(make_name)@echo     make 编译-编译所有c代码@echo     make 链接-链接所有c代码@echo     make 静态-生成静态链接库并生成$(make_name)@echo     make 动态-生成动态链接库并生成$(make_name)@echo     make 清除-清除所有编译文件@echo     make 版本-显示lua版本@echo ------------------------------------

2 特别注意事项

之所以生成文件为tcc-make.exe,是因为将生成文件名称设为make.exe会有很多问题,下面进行讲解,首先这个Makefile可以通过make_name变量控制输出文件名称,如

:: 将输出文件名称设置为gmake.exe
set make_name=gmake.exe
::编译生成gmake.exe
make

在批处理窗口输入上面内容,即可生成gamke.exe
若想生成make.exe,可以这么输入

:: 将输出文件名称设置为make.exe
set make_name=make.exe
::编译生成make.exe
make

上诉命令可以生成make.exe,但是重复输入make则无法重新生成make.exe,错误信息如下
在这里插入图片描述
即make.exe无法对当前目录下的make.exe文件进行删除,提示权限不足.暂时没有好的解决办法.在执行其他命令时也会有这个问题.
只能先生成其他名字再手动更改为make.exe,其次还有另外一种办法解决,就是就是使用其他make程序,我在C:\run\tcc目录下将原先的make.exe复制一份名称改为tcc-make,重新回到gmake文件夹,在批处理窗口输入

:: 将输出文件名称设置为make.exe
set make_name=make.exe
::使用tcc-make编译生成make.exe
tcc-make
::再次编译生成make.exe覆盖原来的make文件
tcc-make

可以看出tcc-make.exe程序可以正常生成和处理make.exe,但是tcc-make.exe也同样无法删除tcc-make.exe,即make程序无法删除同名文件.


http://www.ppmy.cn/news/1578731.html

相关文章

Unity插件-Mirror使用方法(十一)组件介绍(Network Room Player)

目录 一、插件介绍 二、主要组件 Network Manager Network Manager HUD Network Identity Network Transform Network Animator Network Behaviour Network Start Position Network Room Manager 三、Network Room Player 1、组件介绍 2、核心功能 玩家状态同步 …

VUE3性能优化实战

以下是 Vue3 性能优化实战的综合方案,结合高频场景与最佳实践: 一、代码优化策略 1‌. 条件渲染优化‌ 频繁切换显示状态的元素优先使用 v-show,避免 v-if 导致的频繁 DOM 重建与销毁‌:<div v-show="isVisible">内容</div> <!-- 适合高频切换…

C语言操作MySQL从入门到精通

大家好&#xff0c;我是 V 哥。今天给大家整理的内容是关于使用 C 语言操作 MySQL 数据库的详细介绍&#xff0c;从入门到精通&#xff0c;并配有案例代码和注释&#xff0c;帮助小白快速上手。 基本操作 1. 环境准备 在开始之前&#xff0c;你需要安装 MySQL 数据库和 MySQ…

C++入门-基础语法

C入门-基础语法 C基础入门helle world C程序变量常量关键字标识符命名规则 数据类型整型sizeof关键字实型&#xff08;浮点型&#xff09;字符型转义字符字符串型数据的输入 运算符算术运算符赋值运算符比较运算符逻辑运算符 程序流程结构选择结构if语句三目运算符switch语句 循…

第二章 面向对象基础

1. 面向对象基础一 1.1 面相对象入门 1.1.1 定义学生类 package com.itheima.quickstart;/*** ClassName Student* Description 学生类* Author 孙克旭* Date 2025/3/11 8:27*/ public class Student {//成员变量&#xff08;属性&#xff09;String name;double chinese;do…

从头开始开发基于虹软SDK的人脸识别考勤系统(python+RTSP开源)(三)

接着前几天的继续。之前说到了添加人员&#xff0c;现在咱们继续后面剩余的部分。 一、人员的查删 除了增加以外&#xff0c;还有删改查部分的代码&#xff0c;不过修改其实在这里没啥多大的作用&#xff0c;我就没写&#xff0c;直接是查询和删除&#xff0c;修改应该是可以…

MySQL:SQL优化实际案例解析(持续更新)

文章目录 一、MySQL&#xff1a;SQL优化1、时间格式化问题&#xff08;字符串&#xff09;2、in/inner join的问题 一、MySQL&#xff1a;SQL优化 1、时间格式化问题&#xff08;字符串&#xff09; -- 优化前 SELECT * FROM test_table WHERE date_format( begin_time, %Y-%…

GStreamer —— 2.15、Windows下Qt加载GStreamer库后运行 - “播放教程 1:Playbin 使用“(附:完整源码)

运行效果 介绍 我们已经使用了这个元素&#xff0c;它能够构建一个完整的播放管道&#xff0c;而无需做太多工作。 本教程介绍如何进一步自定义&#xff0c;以防其默认值不适合我们的特定需求。将学习&#xff1a; • 如何确定文件包含多少个流&#xff0c;以及如何切换 其中。…