I understand that Visual C++ Linker chooses mainCRTStartup/wmainCRTStartup when option /SUBSYSTEM is set to CONSOLE.
我不明白的是链接器如何在两者之间进行选择。
我在VC 2015上用一个简单的程序测试过,如果wmain存在(连main也存在),就调用wmain。否则调用 main。
最佳答案
链接器将尝试通过遍历 objs 的符号表来推断需要哪个入口点例程。它在 _main 之前搜索 _wmain,这就是为什么选择前者,即使您同时拥有两者。然后链接器从您的默认 libc 静态库中提取适当的启动例程。
您可以通过向链接器提供/ENTRY、/DEFAULTLIB 和/NODEFAULTLIB 选项来覆盖其中的大部分内容。但通常情况下,您让链接器自动处理它。
此外,您的程序中应该只有一个主要的 C 函数。要么显式定义其中之一,要么走 TCHAR 路线,让编译器根据是否定义了 UNICODE 将 _tmain() 替换为 main() 或 wmain()。
关于c - mainCRTStartup 与 wmainCRTStartup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36187320/
IunderstandthatVisualC++LinkerchoosesmainCRTStartup/wmainCRTStartupwhenoption/SUBSYSTEMissettoCONSOLE.我不明白的是链接器如何在两者之间进行选择。我在VC2015上用一个简单的程序测试过,如果wmain存在(连main也存在),就调用wmain。否则调用main。 最佳答案 链接器将尝试通过遍历objs的符号表来推断需要哪个入口点例程。它在_main之前搜索_wmain,这就是为什么选择前者,即使您同时拥有两者。然后链接器从您的默认l
我正在寻找mainCRTStartup的签名。是吗:intmainCRTStartup(intargc,char*argv[])还是别的什么?我发现微软甚至无法给出他们自己的入口点的定义,这让我非常恼火......感谢您的帮助。 最佳答案 在随VisualStudio分发的crtexe.c文件中,您可以看到定义。它是:intmainCRTStartup(void);命令行不是作为入口点的参数获取的,而是使用函数GetCommandLine()恢复的。 关于c-mainCRTStartup