1

我有一个带有 main() 的 c++-winrt 应用程序,如下所示:

int main() {
    Application::Start([](const ApplicationInitializationCallbackParams&) {
        new CWindowsPlatformApp();
    });
}

CWindowsPlatformApp 继承自 winrt::Windows::UI::Xaml::ApplicationT。但是,在编译时,我得到一个像这样的链接器错误:

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() 吗?

4

2 回答 2

4

如果你打开你的 vcxproj 文件,你会看到这个属性分配:

<AppContainerApplication>true</AppContainerApplication>

AppContainerApplication 不是一个名副其实的属性,因为它将应用程序包含与语言选择 (C++/CX) 结合在一起。它同时启用 /ZW (C++/CX) 编译器开关,并导致链接器使用 C++/CX CRT 库 vccorlib(d).lib,它定义了应用程序的入口点,进而导致您的链接错误。

当您迁移到本机项目时,您需要禁用这两个功能。您可以尝试在项目中逐步执行此操作。但最简单的隔离是在项目边界。例如,您不能编译 ISO C++ 和 C++/CX 源文件都#includable 的单个 pch。我建议将所有 C++/CX 代码移动到具有自己的 pch 和 AppContainerApplication=true 的静态库中,并使用本机 main() 和 AppContainerApplication=false 将其链接到您的主应用程序项目中。

于 2018-07-21T15:59:27.527 回答
4

图形 Windows 应用程序的传统入口点函数是WinMain

#include <windows.h>

int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int)
{
}

这是一个使用 C++/WinRT 的完整示例

于 2018-07-16T15:24:36.617 回答