关于tcc、tlink的编译链接机制的研究

要搭建一个简单的C语言编译环境,需要TC2.0、c0s.obj、emu.lib、maths.lib、graphics.lib、cs.lib文件。而这里用编译器tcc.exe、连接器tlink.exe代替了TC2.0,而且相关文件也少了graphics.lib,为什么这样也可以呢?我们先尝试在新建立的环境下编译连接一个文件:

关于tcc、tlink的编译链接机制的研究

 

用命令“tcc hello.c”编译连接生成文件hello.obj和hello.exe:

运行结果为:

在编译连接过程中,第一次我用tcc hello.c编译,发现只生成了hello.obj文件,然后我又用tlink hello.obj连接生成hello.exe文件,结果发现运行这个exe文件会出错。经过检查后发现,我把相关文件里的maths.lib错误地复制成了mathl.lib,可能在连接文件时发生了错误,导致exe文件出错。

那么这个环境与之前的环境相比,少了TC2.0、graphics.lib,多了tcc.exe、tlink.exe。在网上查阅资料发现graphics.lib是一个c语言图形库,TC2.0连接需要这个而tcc.exe不需要,我们可以理解为tc2.0在tcc.exe的基础上多了这么一个扩展,每一个库文件都相当于一个小模块,支持一种扩展。我们需要的时候,只需要添加相应的库文件就行了。

从功能上来看,tcc.exe只能从cmd编译当前目录下已存在的文件,而TC2.0则支持文件的创建、修改、保存、编译、连接,是集成了tcc.exe和tlink.exe的一个c语言小型开发平台。

那么既然新建立的环境将所需要的相关文件减少到了4个,那么是不是还可以减少呢?经过实验,我发现不论去掉哪一种相关文件,在编译时都会出错,生成一个错误的hello.obj文件,并且cmd会有相似的提示:

关于tcc、tlink的编译链接机制的研究

所以我们可以断定,在该环境下,4个相关文件必须都在才能保证编译的成功。

补充研究:在网上查询资料发现,TC2.0是一个集成的开发环境,它集成了以下文件:

INSTALL.EXE 安装程序文件

TC.EXE 集成编译 

TCINST.EXE 集成开发环境的配置设置程序

TCHELP.TCH 帮助文件 

THELP.COM 读取

TCHELP.TCH的驻留程序

README 关于Turbo C的信息文件 

TCCONFIG.EXE 配置文件转换程序

MAKE.EXE 项目管理工具

TCC.EXE 命令行编译

TLINK.EXE Turbo C系列连接器

TLIB.EXE Turbo C系列库管理工具

C0?.OBJ 不同模式启动代码

C?.LIB 不同模式运行库

GRAPHICS.LIB 图形库 

EMU.LIB 8087仿真库

FP87.LIB 8087库

*.H Turbo C头文件

*.BGI 不同显示器图形驱动程序 

*.C Turbo C例行程序(源文件) 

其中: 上面的?分别为: 

T Tiny(微型模式) 

S Small(小模式) 

C Compact(紧凑模式) 

M Medium(中型模式) 

L Large(大模式) 

H Huge(巨大模式)

这个在TC的安装文件夹里其实也可以看出来:

关于tcc、tlink的编译链接机制的研究

但是我们之前的研究发现只需要需要TC2.0就可以成功编译文件,而不需要tcc.exe也在目录下,所以TC2.0是把tcc.exe集成在自己的文件内部的,而不是对外部的编译器进行调用。

查看tcc.exe的功能:

关于tcc、tlink的编译链接机制的研究

可以看到tcc的命令格式是:tcc [选项] [文件名]

缺少正确的相关文件会对编译造成怎样的影响呢?我先用完整的相关文件进行编译,生成的exe文件有8kb,而删去cs.lib后进行编译,发现生成的exe文件只有536字节,比正确的文件要小得多,所以我认为在用tlink进行连接时因为相关文件的缺失导致有很大一部分相关文件都没有连接进来。

在网上查阅资料发现启动代码有T Tiny(微型模式) 、S Small(小模式)、C Compact(紧凑模式) 、M Medium(中型模式) 、L Large(大模式) 、H Huge(巨大模式),那么分别对应的相关文件应该为:c0t.obj,ct.lib,c0s.obj,cs.lib...果然,我们在TC2.0的lib库里发现了相关文件;

关于tcc、tlink的编译链接机制的研究

我发现,其他的模式都有对应的c0*.obj和c*.lib文件,而微型模式只有c0t.obj文件,这是为什么呢?是该模式的编译特性决定他们只要用一个文件吗?我们来试试是否可以编译成功,将c0t.obj拷贝到c:\c文件夹下,再用tcc -mt hello.c编译,发现可以编译连接成功,生成的exe文件也能成功运行,所以微型模式的编译是不需要特定的lib文件,这说明微型模式在编译时不需要向文件里面加入专门的库函数。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/571e793bdc0ee11f7e1f9c7263e4d907.html