我已经在网上和StackOverflow上搜索了很多,但似乎找不到明确回答我的以下问题的答案。
背景:
我想为Windows Phone 8(WP8)平台移植一组C++帮助库。历史上,这些库被构建为静态库(而不是DLL)。
我已经成功编写了特定于WP8的代码,以便库与ARM兼容并使用可用于WP8的API进行构建(使用WP API QuickStart文档作为参考点)。由于必须将经典Win32线程调用替换为WinRT线程池,因此仅有一个库(例如Lib1)需要使用WinRT扩展。
在构建Lib1时,我收到以下警告: 警告1:warning LNK4264:将使用/ZW编译的对象文件存档到静态库中;请注意,在编写Windows Runtime类型时,不建议链接包含Windows Runtime元数据的静态库。
— 搜索这个警告,我找到了 这篇文章,指出: “如果您使用创建公共 ref 类、公共接口类或公共值类的静态库,则链接器会引发此警告。如果静态库未生成在库本身之外被消耗的 Windows 运行时组件,则可以安全地忽略该警告。静态库中的公共组件将编译但不会在运行时激活。任何用于其他组件或应用程序消耗的 Windows 运行时组件必须在动态链接库(DLL)中实现。”
ClassA的函数只会被ClassB从Lib1中调用,然后ClassB可以被链接到应用程序。
最后,我的问题是:
1. 如果作为静态库构建的C++库不使用WinRT扩展(/ZW),它们能否被Windows Phone 8应用程序使用? 2. 如果使用WinRT扩展(/ZW)构建的C++库(Lib1)作为静态库,尽管有警告,它能否被Windows Phone 8应用程序使用? 3. 如果以上问题的答案都是否定的,我是否需要为各自库中的所有类创建WinRT组件包装器,就像this article演示的曼德博集算法一样?还是我还有其他遗漏的东西?
非常感谢您提供的任何帮助。
背景:
我想为Windows Phone 8(WP8)平台移植一组C++帮助库。历史上,这些库被构建为静态库(而不是DLL)。
我已经成功编写了特定于WP8的代码,以便库与ARM兼容并使用可用于WP8的API进行构建(使用WP API QuickStart文档作为参考点)。由于必须将经典Win32线程调用替换为WinRT线程池,因此仅有一个库(例如Lib1)需要使用WinRT扩展。
在构建Lib1时,我收到以下警告: 警告1:warning LNK4264:将使用/ZW编译的对象文件存档到静态库中;请注意,在编写Windows Runtime类型时,不建议链接包含Windows Runtime元数据的静态库。
— 搜索这个警告,我找到了 这篇文章,指出: “如果您使用创建公共 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可以被链接到应用程序。
最后,我的问题是:
1. 如果作为静态库构建的C++库不使用WinRT扩展(/ZW),它们能否被Windows Phone 8应用程序使用? 2. 如果使用WinRT扩展(/ZW)构建的C++库(Lib1)作为静态库,尽管有警告,它能否被Windows Phone 8应用程序使用? 3. 如果以上问题的答案都是否定的,我是否需要为各自库中的所有类创建WinRT组件包装器,就像this article演示的曼德博集算法一样?还是我还有其他遗漏的东西?
非常感谢您提供的任何帮助。