mainCRTStartup与wmainCRTStartup < >我理解Visual C++链接器选择主代码启动> />代码>代码> WMCRCRTSTEST/选项>代码>子系统< /C> >设置为控制台< /C> >

mainCRTStartup与wmainCRTStartup < >我理解Visual C++链接器选择主代码启动> />代码>代码> WMCRCRTSTEST/选项>代码>子系统< /C> >设置为控制台< /C> >,c,windows,C,Windows,我不明白的是链接器如何在两者之间进行选择 我在VC 2015上用一个简单的程序进行了测试。如果wmain存在(甚至main也存在),则调用wmain。否则调用main 链接器将尝试通过遍历OBJ的符号表来推断需要哪个入口点例程。它在main之前搜索_wmain,这就是为什么前者被选中的原因,即使您同时拥有两个。然后链接器从默认的libc静态库中提取适当的启动例程 您可以通过向链接器提供/ENTRY、/DEFAULTLIB和/NODEFAULTLIB选项来覆盖大部分内容。但通常情况下,您会让链接器

我不明白的是链接器如何在两者之间进行选择


我在VC 2015上用一个简单的程序进行了测试。如果wmain存在(甚至main也存在),则调用wmain。否则调用main

链接器将尝试通过遍历OBJ的符号表来推断需要哪个入口点例程。它在main之前搜索_wmain,这就是为什么前者被选中的原因,即使您同时拥有两个。然后链接器从默认的libc静态库中提取适当的启动例程

您可以通过向链接器提供/ENTRY、/DEFAULTLIB和/NODEFAULTLIB选项来覆盖大部分内容。但通常情况下,您会让链接器自动处理此问题


此外,您的程序中应该只有一个主C函数。可以显式定义一个或另一个,或者按照TCHAR路线,让编译器根据是否定义了UNICODE将_tmain()替换为main()或wmain()。

没有什么神奇之处,它可以从obj文件中的符号知道哪一个是合适的。如果它看到了wmainCRTStartup,那么它就知道wmainCRTStartup是最佳选择。