Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linker 使用Turbo C编译并链接到.com文件_Linker_Dos_X86 16_Memory Model_Turbo C - Fatal编程技术网

Linker 使用Turbo C编译并链接到.com文件

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()类似于忽略返回值的入口点,但不能识别所

我正在尝试使用Turbo C编译器和链接器编译一个简单的程序并将其链接到DOS.com文件。这样我就可以尝试我能想到的最简单的C程序了

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