题
这个代码汇编,但没有惊喜,它将失败的话,联系(没有主要发现):
清单1:
void main();
链接的错误:\mingw\lib\libmingw32.一个(主要的。o):主。c:(.文+0x106)未定义的参考_WinMain@16'
但是,以下代码汇编和链接的现,有一个警告:
清单2
void (*main)();
警告:'主要'通常的功能
问题:
在清单1、连接器应该有 抱怨缺少"主要".为什么 它是寻找_WinMain@16?
可执行的产生,从 列表2简单的崩溃。是什么 原因呢?
感谢您的时间。
解决方案
案例1.是Windows具体编译可能产生 _WinMain
符号的时候 main
被正确地定义。
2的情况。-你有一个指针,但作为静态变量 它的初始化为零, ,因此崩溃。
其他提示
真的, main
并不需要一个功能。这个已经用在一些模糊处理程序包含二进制的程序编码在一系列被称为 main
.
回归类型的主要()必须 int
(不 void
).如果连接是在寻找 WinMain
, 它认为你有一个GUI应用程序。
在大多数C编译系统,没有类型信息与符号相连的。你可以宣布主要作为例如:
char main[10];
和连接将非常高兴。正如你指出,程序可能会崩溃,uless你巧妙的初始化的内容列。
你的第一个例子没有界定主要的,它刚刚宣布的,因此连接的错误。
第二个例子界定了主要的,但是不正确。
在窗平台的节目的主要单元是WinMain如果您没有设置的程序作为控制台应用程序。在"@16"意味着它期待16个字节的参数。因此链接器将很高兴与你只要给它一个功能,名为WinMain与16个字节的参数。
如果你 想 控制台应用程序,这是您的指示,你乱七八糟的东西了。
你宣布一个针对功能,名为主,并且连接到警告你,这不会的工作。
该_WinMain消息要与如何Windows程序的工作。下面的水平C runtime,Windows可执行有WinMain.
尝试重新定义为 int main(int argc, char *argv[])
什么你已经是一个接头的错误。连接希望找到一个功能与"签名"-不是无效,没有参数
看看 http://publications.gbdirect.co.uk/c_book/chapter10/arguments_to_main.html 等等
在清单1,你是说"有一个主要()定义的其他地方,在我的代码-我承诺!".这就是为什么它编译。但你躺在那里,这就是为什么链接出现故障。因为你得到的缺失WinMain16错误,是由于标准库(Microsoft compiler)包含一个定义,主要(),其中要求WinMain().在Win32程序,你定义WinMain()以及连接,将采用图书馆版本的主要()呼WinMain().
列表2,你有一个符号被称为主定义,所以两个编译器和连接是幸福的,但在启动代码将尝试打电话的功能在位置"主要的",并发现那是真的不是一个功能,而崩溃。
1.) 一个(compiler/平台)依赖功能被称为代码之前在主要被执行,因此你的行为(_init
在linux/glibc).
2)的代码崩溃在第2种情况下是合理的,因为该系统是无法访问的内容的符号 main
作为一个功能,这实际上是一个功能的指针指向任意位置。