我已经打开了一个带有main()的c ++-winrt应用程序窗口,如下所示:
int main() {
Application::Start([](const ApplicationInitializationCallbackParams&) {
new CWindowsPlatformApp();
});
}
winrt :: Windows :: UI :: Xaml :: ApplicationT的CWindowsPlatformApp继承。但是,在编译时出现如下链接错误:
vccorlibd.lib(climain.obj) : error LNK2019: unresolved external symbol "?main@@YAHP$01$AAV?$Array@P$AAVString@Platform@@$00@Platform@@@Z" (?main@@YAHP$01$AAV?$Array@P$AAVString@Platform@@$00@Platform@@@Z) referenced in function "int __cdecl _main(void)" (?_main@@YAHXZ)
main的CX签名仍然有效,但是我目前正在将所有CX代码转换为c ++-winrt。
int __cdecl main(Platform::Array<Platform::String^>^)
如果我将子系统更改为控制台应用程序,它也可以正确链接。
但是无论如何,我可以使用c ++-winrt指定Windows app-main()吗?
答案 0 :(得分:4)
图形Windows应用程序的传统入口点功能为WinMain:
#include <windows.h>
int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int)
{
}
答案 1 :(得分:3)
如果您打开vcxproj文件,则会看到此属性分配:
<AppContainerApplication>true</AppContainerApplication>
AppContainerApplication不是一个好名字的属性,因为它结合了应用程序包含和语言选择(C ++ / CX)。它同时启用了/ ZW(C ++ / CX)编译器开关,并使链接器使用C ++ / CX CRT库vccorlib(d).lib,该库定义了应用程序的入口点,进而导致链接错误。>
在迁移到本机项目时,需要禁用这两个功能。您可以尝试在项目中逐步执行此操作。但是最简单的隔离是在项目边界。例如,您不能编译ISO C ++和C ++ / CX源文件可包含的#个pch。我建议将所有C ++ / CX代码移动到具有自己的pch和AppContainerApplication = true的静态库中,并使用本机main()和AppContainerApplication = false将其链接到您的主应用程序项目中。