用tcc将程序编译为.obj文件。
这里也可以使用tcc -linclude run.c来将run.c文件编译成run.obj文件。
再用tcc对下面的程序进行编译链接,发现提示错误:
提示标志f在程序中未定义。这说明如果程序里出现未定义的变量或函数,编译器能够正常将原文件编译成.obj文件,只是会提示而已。
要怎么生成正确的exe文件呢,我们要把run1.c中未定义的f函数链接进来,但是我们之前的链接都是链接的系统提供的相关文件,怎么链接自带文件呢?我们先研究一下tlib.exe。
tlib.exe使用方法如下;
即使用tlib的格式为tlib libname [/C] [/E] commands, listfile
libname:要建立的用户目标模块库,缺省的扩展名为.LIB
/C:大小写敏感标志。该选项不常用。
/E:建立扩展字典。建立扩展字典可以加速大的库文件的连接过程。
commands: 操作列表,由若干个动作符以及每个动作符后面的文件名或模块名组成。TILB支持的动作符有5种:“+"、“-"、“*"、“-*"或“*-"、“-+"或“+-"。“+"是把指定的文件加到指定的库中; “-"从库中删除指定的模块;“*"将相应的模块从库中抽取并写到指定的文件中,原库不变;“-*"或“*-"是将库中指定的模块拷贝到指定的文件中,然后把该模块从库中删除;“-+"或“+-"是将指定的模块用指定的文件或模块代替。
Listfile:建立列表文件。列表文件按字母顺序将库中各模块列表,为文本文件,可用DOS的TYPE命令查看。
那么将含有f函数的run.obj添加到cs.lib里的语句如下:
之后用tcc编译链接文件run1.c,没有出现错误提示。用debug加载生成的exe文件:
这是main函数的代码
这是f函数的代码
所以,我们将函数f写在程序run.c中,编译成run.obj,再将run.obj用tlib链接入cs.lib,这样tcc编译时发现原文件中没有定义函数f,就会在c语言默认的函数库cs.lib中寻找,找到后将其链接,生成run1.exe文件,所以我们在run1.exe文件中可以看到函数f的代码,它是在tlink连接时加入的。
用tlib cs.lib cs.txt可以在cs.txt或者cs.lst文件中导入cs.lib的函数的目录。
将此程序编译成f.obj,并加入cs.lib中。
将上面的程序编译链接成b.exe,用debug加载:
Main函数的内容为:
f1函数的内容为:
f2函数的内容为:
函数func的内容为;