将跨平台的C++库移植到Windows Phone 8平台

15
我已经在网上和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)中实现。”

在 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演示的曼德博集算法一样?还是我还有其他遗漏的东西?
非常感谢您提供的任何帮助。
1个回答

5
问题1 只要你不使用手机上不允许的任何API,例如Win32、MFC等,就可以使用。某些标准c功能有一些限制;例如,您只能在应用程序本地区域中调用fopen文件。当然,您只能从C++代码中访问静态库中的功能。这种情况是我喜欢称之为“Plain Old C++”场景。它可以正常工作。 问题2 只要您在静态库中定义的任何ref类仅打算从该静态库内部使用,就可以。因此,在您的示例中,只要Class A是一个普通的C++类,您就没问题了。实质上,您不能像.NET程序集中的公共类那样拥有公共的ref类,因为这需要一些COM-on-steroids魔法,而这只编译到Windows Runtime组件中。如果您有纯粹的C++代码包装您对任何ref类代码的调用,并且消耗您的静态库的代码以纯粹的C++方式消耗它,则您就没有问题了。逻辑表明,您将无法传递WinRT类型出静态库,尽管我还没有测试这个假设。 问题3 我认为您引用的文章忽略了静态库中的代码可以访问ref类等事实,因此不用担心,您不必在静态库周围编写Windows Runtime组件包装器。只有当您希望静态库中的代码通过“公共类”(在.NET程序集意义上)可用时,才需要这样做。
请记住,您仍然正在为Windows商店构建一个静态库。它是本地代码,但它仍然可以执行所有C++/CX操作,只是不包括COM激活部分,以允许其中定义的类型在静态链接的C++场景之外可访问。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接