mainCRTStartup vs wmainCRTStartup

时间:2016-03-23 19:43:46

标签: c windows

我了解当选项struct B { // for example int UglyName(std::string str, int i) { std::cout << str << " " << i << std::endl; return i + 1; } }; struct C : B { template<typename ...Args> auto PrettyName(Args&& ...args) { return UglyName(std::forward<Args>(args)...); } }; int main() { C c; std::cout << "return value: " << c.PrettyName("Test Message: ", 23) << std::endl; return 0; } 设置为mainCRTStartup时,Visual C ++链接器会选择wmainCRTStartup / /SUBSYSTEM

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

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

1 个答案:

答案 0 :(得分:2)

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

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

此外,您的程序中只应有一个主C函数。要么显式定义其中一个,要么转到TCHAR路由,让你的编译器用main()或wmain()替换_tmain(),具体取决于是否定义了UNICODE。