WinRT 库在发布模式下不工作
WinRT library not working in Release mode
我在 Visual Studio 2012 年一直在尝试使用 WinRT 库构建桌面应用程序。
代码片段如下。
[STAThread]
int wmain (Platform :: Array <String ^> ^ args)
{
wcout << L"Copyright (c) Microsoft Corporation. All rights reserved." << endl;
wcout << L"FindPackages sample" << endl << endl;
try
{
auto packageManager = ref new Windows::Management::Deployment::PackageManager();
auto packages = packageManager->FindPackages();
int packageCount = 0;
std::for_each(Windows::Foundation::Collections::begin(packages), Windows::Foundation::Collections::end(packages),
[&packageManager, &packageCount](Windows::ApplicationModel::Package^ package)
{
DisplayPackageInfo(package);
DisplayPackageUsers(packageManager, package);
wcout << endl;
packageCount += 1;
});
}
catch (AccessDeniedException^)
{
wcout << L"FindPackagesSample failed because access was denied. This program must be run from an elevated command prompt." << endl;
return 1;
}
catch (Exception^ ex)
{
wcout << L"FindPackagesSample failed, error message: " << ex->ToString()->Data() << endl;
return 1;
}
getchar();
return 0;
}
这用于列出 Metro 应用的详细信息。这段代码在 DEBUG 模式下运行良好。但是当我将其更改为发布模式时,出现错误:
error LNK2001: unresolved external symbol _NtProcessStartup
注意:
我更改了某些设置,例如
配置属性 -> C/C++-> COnsume Windows Runtime Exception to Yes(/ZW)
配置属性 -> C/C++-> 代码生成 -> 启用最小重建到 NO(/gm-)
配置属性 -> C/C++-> 代码生成 -> 运行时库到多线程 DLL(/MD)
据悉,这些设置对于包含 WinRT 库是强制性的。
所以基本上,我必须 运行 我的代码以 Multi_Threaded (/MT) 格式用于发布模式。但是 /MT 或 /Mtd 与 WinRT 库所需的 (/ZW) 方法不兼容。
请指导我的错误。
您收到有关缺少 NtProcessStartup 符号的消息这一事实意味着使用了链接器开关 /SUBSYSTEM:NATIVE。因为这是唯一需要 NtProcessStartup 函数而不是 wmain/main 的选项。因此,您的发布模式选项以某种方式将您的应用程序标记为 NATIVE(通常是设备驱动程序)应用程序。 (或者您专门添加了一个 /ENTRY:NtProcessStartup 但这对我来说似乎不太可能)。
我在 Visual Studio 2012 年一直在尝试使用 WinRT 库构建桌面应用程序。 代码片段如下。
[STAThread]
int wmain (Platform :: Array <String ^> ^ args)
{
wcout << L"Copyright (c) Microsoft Corporation. All rights reserved." << endl;
wcout << L"FindPackages sample" << endl << endl;
try
{
auto packageManager = ref new Windows::Management::Deployment::PackageManager();
auto packages = packageManager->FindPackages();
int packageCount = 0;
std::for_each(Windows::Foundation::Collections::begin(packages), Windows::Foundation::Collections::end(packages),
[&packageManager, &packageCount](Windows::ApplicationModel::Package^ package)
{
DisplayPackageInfo(package);
DisplayPackageUsers(packageManager, package);
wcout << endl;
packageCount += 1;
});
}
catch (AccessDeniedException^)
{
wcout << L"FindPackagesSample failed because access was denied. This program must be run from an elevated command prompt." << endl;
return 1;
}
catch (Exception^ ex)
{
wcout << L"FindPackagesSample failed, error message: " << ex->ToString()->Data() << endl;
return 1;
}
getchar();
return 0;
}
这用于列出 Metro 应用的详细信息。这段代码在 DEBUG 模式下运行良好。但是当我将其更改为发布模式时,出现错误:
error LNK2001: unresolved external symbol _NtProcessStartup
注意:
我更改了某些设置,例如
配置属性 -> C/C++-> COnsume Windows Runtime Exception to Yes(/ZW)
配置属性 -> C/C++-> 代码生成 -> 启用最小重建到 NO(/gm-)
配置属性 -> C/C++-> 代码生成 -> 运行时库到多线程 DLL(/MD)
据悉,这些设置对于包含 WinRT 库是强制性的。 所以基本上,我必须 运行 我的代码以 Multi_Threaded (/MT) 格式用于发布模式。但是 /MT 或 /Mtd 与 WinRT 库所需的 (/ZW) 方法不兼容。 请指导我的错误。
您收到有关缺少 NtProcessStartup 符号的消息这一事实意味着使用了链接器开关 /SUBSYSTEM:NATIVE。因为这是唯一需要 NtProcessStartup 函数而不是 wmain/main 的选项。因此,您的发布模式选项以某种方式将您的应用程序标记为 NATIVE(通常是设备驱动程序)应用程序。 (或者您专门添加了一个 /ENTRY:NtProcessStartup 但这对我来说似乎不太可能)。