Linker 使用Turbo C编译并链接到.com文件
我正在尝试使用Turbo C编译器和链接器编译一个简单的程序并将其链接到DOS.com文件。这样我就可以尝试我能想到的最简单的C程序了Linker 使用Turbo C编译并链接到.com文件,linker,dos,x86-16,memory-model,turbo-c,Linker,Dos,X86 16,Memory Model,Turbo C,我正在尝试使用Turbo C编译器和链接器编译一个简单的程序并将其链接到DOS.com文件。这样我就可以尝试我能想到的最简单的C程序了 void main() {} 在Turbo C链接器中是否有链接到com文件的命令行参数 我从链接器获得的错误消息如下: “致命:无法生成COM文件:无效的入口点地址” 我知道com文件的入口点必须是100小时。Turbo C是否有设置此地址的选项?您的问题是关于“入口点” 某些编译器或链接器可以识别void main()类似于忽略返回值的入口点,但不能识别所
void main()
{}
在Turbo C链接器中是否有链接到com文件的命令行参数
我从链接器获得的错误消息如下:
“致命:无法生成COM文件:无效的入口点地址”
我知道com文件的入口点必须是100小时。Turbo C是否有设置此地址的选项?您的问题是关于“入口点”
某些编译器或链接器可以识别void main()
类似于忽略返回值的入口点,但不能识别所有返回值
您应该使用intmain()
入口点来更好地控制应用程序,编译器可以将main函数识别为入口点
例如:
int main() {
/* some compiler return 0 when you don't for main,
they can ask for return value */
}
来自GeekForgeks:
一致性实现可以提供更多版本的main(),但它们都必须具有返回类型int。main()返回的int是程序向调用它的“系统”返回值的一种方式。在不提供这种设施的系统中,返回值被忽略,但这不会使“空虚主”()“合法C++”或“合法C”。即使编译器接受“无效主程序”,也避免了它,或者被C和C++程序员认为是无知的。
在C++中,主()不需要包含显式返回语句。在这种情况下,返回的值为0,表示执行成功
资料来源:我已经很长时间没有真正尝试使用Turbo-C来做这种事情了。如果您使用TCC.EXE和TLINK.EXE分别在命令行上编译和链接,则这可能适用于您 要编译并链接到COM文件,可以对每个C源文件执行此操作,并为每个C源文件创建OBJ文件:
tcc -IF:\TURBOC3\INCLUDE -c -mt file1.c
tcc -IF:\TURBOC3\INCLUDE -c -mt file2.c
tcc -IF:\TURBOC3\INCLUDE -c -mt file3.c
tlink -t -LF:\TURBOC3\LIB c0t.obj file1.obj file2.obj file3.obj,myprog.com,myprog.map,cs.lib
每个C文件都使用-mt
(微型内存模型)单独编译为相应的OBJ文件。-I
选项指定环境中包含目录的路径(相应更改)。-c
选项告诉TCC仅编译为OBJ文件
当链接-t
告诉链接器生成COM程序(而不是EXE)时,-LF:\TURBOC3\LIB
是环境中库目录的路径(相应更改)。C0T.OBJ是微型内存模型的C运行时文件。这包括您缺少的主要入口点。然后列出由空格分隔的所有其他OBJ文件。第一个逗号后是输出文件名。如果使用-t
选项,请使用COM扩展名命名程序。第二个逗号后是地图文件名(如果不需要地图文件,可以将文件名留空)。第三个逗号后是由空格分隔的库列表。对于微型模型,您希望使用小型模型库。小内存模型的C库称为CS.LIB
例如,如果我们有一个名为TEST.C的源文件,它看起来像:
#include<stdio.h>
int main()
{
printf("Hello, world!\n");
return 0;
}
您必须为自己的环境使用路径。这些命令应该生成一个名为TEST.COM的程序。运行时,应打印:
你好,世界
您可以在仍然使用IDE生成EXE的情况下生成COM文件。在TC 2.01上进行了以下操作。在选项中将内存模型更改为Tiny,然后编译程序并生成EXE文件,然后转到命令提示符,然后运行EXE2BIN PROG.EXE PROG.COM。用您的程序名替换PROG。您解决问题时运气好吗?是的,我确实运气好。使用C0T ASM文件作为入口点,并升级到Turbo C或C++的一些版本。所以我猜我的答案的一部分可能已经应用到你的情况了吗?
tcc -IF:\TURBOC3\INCLUDE -c -mt test.c
tlink -t -LF:\TURBOC3\LIB c0t.obj test.obj,test.com,test.map,cs.lib