首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将跨平台C++库移植到Windows 8平台

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

Stack Overflow用户
提问于 2013-02-12 13:37:22
回答 1查看 2.9K关注 0票数 15

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

上下文:

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

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

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

-在搜索此警告时,我找到了this article,并指出:“如果您使用创建公共引用类、公共接口类或公共值类的静态库,则链接器将引发此警告。如果静态库没有生成在库之外使用的Windows组件,则可以安全地忽略该警告。静态库中的公共组件将编译,但在运行时不会激活。任何供其他组件或应用程序使用的Windows组件都必须在动态链接库(DLL)中实现。”

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

代码示例:

代码语言:javascript
复制
// 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的应用程序使用。

终于回答了我的问题:

  1. 当作为静态库构建时,不使用C++扩展(/ZW)的WinRT库可以被Windows 8应用程序使用吗?
  2. 当作为静态库构建时,使用C++扩展(/ZW)的Lib1库可以被Windows 8应用程序使用吗?
  3. 如果这两个问题的答案都是否定的,我是否必须为各自库中的所有类创建WinRT组件包装器,就像this article用Mandelbrot算法演示的那样?或者我还遗漏了什么?

预先感谢您所能提供的任何投入。

EN

回答 1

Stack Overflow用户

发布于 2013-05-01 06:11:59

问题1是的,只要您不使用任何在电话上不允许使用的API,例如Win32、MFC等等。一些标准的c++特性在它们周围有一些限制;例如,您只能在应用程序本地的文件上调用fopen。当然,您只能从C++代码访问静态库中的功能。我喜欢把这个场景称为“朴素的老C++”场景。效果很好。

问题2是的,只要您在该静态库中定义的任何ref类都只打算在该静态库中使用。因此,在您的示例中,只要A类是一个常规的旧C++类,就可以了。本质上,您不能拥有与.NET程序集中的公共类具有相同意义的ref类,因为这需要一些COM on-steroids魔术,并且只能编译到Windows组件中。如果您有普通的旧C++代码环绕对任何ref类代码的调用,而使用静态库的代码以普通的旧C++方式使用它,那么您就没事了。逻辑表明,您将无法将WinRT类型从静态库中传递出去,尽管我还没有测试过这个假设。

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14833852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档