我已经搜索了很多网络和 StackOverflow,但似乎无法为我的以下问题找到明确的答案。
语境:
我希望移植一组用于 Windows Phone 8 (WP8) 平台的 C++ 帮助程序库。从历史上看,这些库是作为静态库(而不是 DLL)构建的。
我已经成功编写了特定于 WP8 的代码,因此这些库兼容并针对 ARM 构建,使用 WP8 可用的 API(使用 WP API 快速入门文档作为参考点)。由于必须用 WinRT 的 ThreadPool 替换经典的 Win32 线程调用,因此只有一个库(例如 Lib1)需要使用 WinRT 扩展(/ZW 标志)。
在构建 Lib1 时,我收到以下警告:警告 1 警告 LNK4264:将使用 /ZW 编译的目标文件归档到静态库中;请注意,在创作 Windows 运行时类型时,不建议与包含 Windows 运行时元数据的静态库链接。
— 搜索此警告时,我发现了这篇文章,指出:“如果您使用创建公共 ref 类、公共接口类或公共值类的静态库,链接器会引发此警告。您可以放心地忽略该警告如果静态库不会生成在库本身之外使用的 Windows 运行时组件。静态库中的公共组件将编译,但不会在运行时激活。任何旨在供其他组件或应用使用的 Windows 运行时组件必须在动态中实现-链接库(DLL)。”
在 Lib1 中,ClassA 包含使用 WinRT ThreadPool 调用的函数。ClassA 函数由 ClassB 调用,它们只是将常规 HANDLE 和 DWORD 返回给 ClassB。
代码示例:
// ClassA.cpp
HANDLE WINAPI ClassA::CreateThread(/* Params that are usually passed to Win32 CreateThread */)
{
// Do WinRTThreadPool stuff to create WorkItem
auto workItem = ref new Windows::System::Threading::WorkItemHandler([=](Windows::Foundation::IAsyncAction^)
// More code that eventually results in a Win32 Handle
return handle;
}
// ClassB.cpp
Handle handle = ClassA::CreateThread(/* Params that are usually passed to Win32 CreateThread */);
ClassA 的函数只能由 ClassB 从 Lib1 中调用,然后 ClassB 可以由链接 Lib1 的应用程序使用。
最后,对于我的问题:
不使用 WinRT 扩展 (/ZW)的 C++ 库在构建为静态库时是否可以被 Windows Phone 8 应用程序使用?
使用 WinRT 扩展 (/ZW)的 C++ 库 (Lib1)在构建为静态库时是否可以被 Windows Phone 8 应用程序使用,尽管有警告?
如果两个问题的答案都是否定的,我是否必须为相应库中的所有类创建 WinRT 组件包装器,就像本文使用 Mandelbrot 算法演示的那样?还是我还缺少其他东西?
提前感谢您提供的任何意见。