WP8*_*ner 15 c++ cross-platform static-libraries windows-runtime windows-phone-8
我搜索过网络和StackOverflow很多,但似乎无法找到我以下问题的明确答案.
语境:
我希望移植一组C++帮助程序库,以便与Windows Phone 8(WP8)平台一起使用.从历史上看,这些库是作为静态库(而不是DLL)构建的.
我已成功编写了特定于WP8的代码,因此使用WP8可用的API(使用WP API QuickStart doc作为参考点),库与ARM兼容并构建.由于必须用WinRT的ThreadPool替换经典的Win32 Thread调用,因此只有一个库(例如Lib1)需要使用WinRT扩展(/ ZW标志).
构建Lib1时,我收到以下警告:警告1警告LNK4264:将使用/ ZW编译的目标文件归档到静态库中; 请注意,在创作Windows运行时类型时,建议不要使用包含Windows运行时元数据的静态库进行链接.
- 搜索此警告,我发现这篇文章,指出:"如果您使用创建公共引用类,公共接口类或公共值类的静态库,链接器会引发此警告.如果静态,您可以安全地忽略警告库不会生成在库本身之外使用的Windows运行时组件.静态库中的公共组件将编译但不会在运行时激活.任何打算供其他组件或应用程序使用的Windows运行时组件必须在动态中实现-link library(DLL)."
在Lib1中,ClassA包含使用WinRT ThreadPool调用的函数.ClassA调用ClassA函数,它们只是将常规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 */);
Run Code Online (Sandbox Code Playgroud)
ClassA的函数只能由ClassB从Lib1中调用,然后ClassB可以被链接Lib1的应用程序使用.
最后,对我的问题:
当构建为静态库时,不使用WinRT扩展(/ ZW)的C++库是否可以被Windows Phone 8应用程序使用?
尽管有警告,Windows Phone 8应用程序可以使用构建为静态库的C++库(Lib1)吗?它可以使用WinRT扩展(/ ZW)吗?
如果对这两个问题的答案都是肯定的,那么我是否必须为相应库中的所有类创建WinRT Component包装器,就像本文使用Mandelbrot算法演示一样?或者还有其他我想念的东西?
提前感谢您提供的任何输入.
问题1 是的,只要您没有使用手机上不允许的任何API,例如Win32,MFC等.某些标准c功能对它们有一些限制; 例如,您只能对应用程序本地区域中的文件调用fopen.当然,您只能从C++代码访问静态库中的功能.我喜欢这种情况称为"普通的旧C++"场景.它工作正常.
问题2 是的,只要您在该静态库中定义的任何引用类仅用于在该静态库中使用.所以在你的例子中,只要A类是一个普通的旧C++类,你就可以了.从本质上讲,你不能拥有与.NET程序集中的公共类一样公开的ref类,因为这需要一些COM-on-steroids魔法,并且只能编译到Windows运行时组件中.如果你有简单的旧C++代码包装你的任何ref类代码的调用,并且使用静态lib的代码以简单的旧C++方式使用它,那么你没关系.逻辑表明你将无法从静态库中传递WinRT类型,尽管我还没有测试过这个假设.
问题3 我相信你引用的文章错过了静态库中的代码可以访问ref类等的事实,所以不用担心,你不必在静态库中编写Windows运行时组件包装器.如果您希望静态库中的代码可以通过"公共类"(在.NET程序集意义上)获得,那么您只想这样做.
要记住的是,你仍然在为Windows商店构建一个静态库".它是本机代码,但它仍然可以执行所有C++/CX的工作,它只是不包含COM激活内容,以允许在静态链接的C++场景之外访问其中定义的类型.