将跨平台C++库移植到WindowsPhone8平台

Porting cross-platform C++ libraries to Windows Phone 8 platform

本文关键字:WindowsPhone8 平台 跨平台 C++      更新时间:2023-10-16

我在网络和StackOverflow上搜索了很多,但似乎找不到以下问题的确切答案。

上下文:

我希望移植一组C++帮助程序库,以便与WindowsPhone8(WP8)平台一起使用。从历史上看,这些库是作为静态库(而不是DLL)构建的。

我已经成功地编写了WP8特定的代码,因此这些库是兼容的,并使用WP8可用的API(使用WPneneneba API QuickStart文档作为参考点)构建ARM。只有一个库(例如Lib1)需要使用WinRT扩展(/ZW标志),因为必须用WinRT的ThreadPool替换经典的Win32线程调用。

在构建Lib1时,我收到以下警告:警告1警告LNK4264:将使用/ZW编译的对象文件归档为静态库;请注意,在编写Windows运行时类型时,不建议链接到包含Windows运行时元数据的静态库。

--在搜索此警告时,我发现了这篇文章,其中写道:"如果使用创建公共引用类、公共接口类或公共值类的静态库,则链接器会发出此警告。如果静态库没有生成在库本身之外使用的Windows运行时组件,则可以安全地忽略此警告。静态库中的公共组件将编译,但在运行时不会激活要供其他组件或应用程序使用的e组件必须在动态链接库(DLL)中实现。"

在Lib1中,ClassA包含使用WinRT ThreadPool调用的函数。ClassA函数由ClassB调用,它们只是向ClassB返回常规的HANDLE和DWORD。

代码示例:

// 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中调用,然后链接Lib1的应用程序可以使用ClassB。

最后,回答我的问题:

  1. 而不是的C++库是否可以使用WinRT扩展(/ZW),当作为静态库构建时,是否由Windows Phone 8应用程序使用?

  2. 执行的C++库(Lib1)是否可以使用WinRT扩展(/ZW),当构建为静态库时,由Windows Phone 8使用应用程序,尽管有警告?

  3. 如果两个问题的答案都是否定的,我是否必须创建WinRT用于各个库中的所有类的组件包装器,就像这篇文章用Mandelbrot算法演示的那样?或者我还缺少什么?

提前感谢您提供的任何意见。

问题1是的,只要你不使用任何不允许在手机上使用的API,例如Win32、MFC等。一些标准的c功能有一些限制;例如,您只能对应用程序本地区域中的文件调用fopen。当然,您只能从C++代码访问静态库中的功能。这个场景就是我喜欢称之为"普通老C++"的场景。它运行良好。

问题2是的,只要您在该静态库中定义的任何ref类仅用于该静态库内。所以在你的例子中,只要A类是一个普通的老C++类,你就可以了。本质上,你不能拥有与.NET程序集中的公共类相同意义上的公共ref类,因为这需要一些COM上的魔法,而且只能编译到Windows运行时组件中。如果您有一个简单的旧C++代码,它封装了对任何ref类代码的调用,并且使用静态lib的代码以一种简单的旧++方式使用它,那么您就可以了。逻辑表明,您将无法从静态库中传递WinRT类型,尽管我还没有测试过这个假设。

问题3我相信您引用的文章忽略了静态库中的代码可以访问ref类等的事实,所以不用担心,您不必围绕静态库编写Windows运行时组件包装器。只有当您希望静态库中的代码通过"公共类"(在.NET程序集意义上)可用时,才需要这样做。

需要记住的是,您仍在为"windows商店"构建一个静态库。它是本机代码,但它仍然可以执行所有C++/CX的功能,只是不包括COM激活功能,以允许在静态链接的C++场景之外访问其中定义的类型。