可以使用Mingw来构建Windows Store应用程序吗?

22

有没有一种方法可以使用Mingw工具链构建Windows商店应用程序?(并最终从Linux上的mingw进行交叉编译,因为如果它在一个Mingw工具链中工作,它应该在另一个中也可以工作。)

我猜一个要求是坚持 允许的API:在Windows商店应用程序沙箱中,但在分发到商店之前还有什么其他事项需要考虑?XAML?32位或64位代码?

由于Mingw C ++与MSVC ++不兼容,我假设没有WRL的纯C程序将是实现此目标的最简单方法?


感谢您提供 MXE 的链接,我以前从未听说过它... 可能是我最近见过的最酷的东西。 - Damon
@Damon,我也是这么想的,当我前几天看到它时,我觉得我必须在这里放一个链接,让其他人也能看到它。它真的非常非常酷。 :-) - Prof. Falken
如果您尝试运行它,可能会发现其中一个库找不到,只需从镜像下载并将其放入pkg/目录中,编译即可恢复。@Damon - Prof. Falken
@Damon,这是ftp://core.ring.gr.jp/pub/graphics/gd/gd-2.0.35.tar.bz2,我必须手动下载。 - Prof. Falken
在运行aptitude安装了两个缺失的依赖项后,这个程序对我来说基本上是开箱即用的。 - Damon
@Damon,哈哈,对我来说,在我的上网本上编译仍然需要48小时 :) - Prof. Falken
3个回答

11
您需要直接使用 Windows Runtime C++ Template Library (WRL) ,因为 Mingw 不支持 C++/CX。除此之外,我认为您只需要 Windows 8 SDK 并配置 Mingw 使用头文件和库文件。此外,您将无法使用 XAML 来描述用户界面,您需要手动在代码中创建您的 UI。

与其试图使用 Mingw 编写整个应用程序并在 Linux 上进行交叉编译,您可以使用 Mingw 编写核心库,然后使用 Visual Studio Express(免费版本)编写简单的 UI 包装器。这样,您可以使用所有好用的东西,如 XAML 和引用计数实例。

这就是我的做法——编写用 C++ 编写的库,然后编写一个单独的 UI 项目(使用 XAML)来引用其他库。它运行良好。


1
页面上写着:“WRL使您更轻松地实现和使用组件对象模型(COM)组件。” 但是从C语言中,您可以直接调用COM对象,而不需要WRL包装器。因此,除非您提供一些证据,否则我不认为WRL是必要的。抱歉,您的答案让我有更多的问题。 :-) - Prof. Falken
1
我还没有尝试过,所以不能百分之百确定,但我认为你不需要链接任何WinRT库,因为它们都是通过COM访问的。对我来说,这现在是一个灰色地带 :) - Mark Ingram
编辑你的问题,这样我就可以点赞了。我已经完全同意了。 - Prof. Falken
不过,如果有人用完全由自由软件编写的代码来制作适用于Windows 8/RT/METRO的“Hello World”,那将是非常酷的事情。 - Prof. Falken
1
你可以看一下cppwinrt https://github.com/Microsoft/cppwinrt 我已经用mingw64编译/链接了... 唯一的问题是,我需要手动定义不同接口的UUID...这是mingw不知道的。也许有人会更新mingw头文件到windows10 SDK。我不知道这是如何工作的。 - Gabor
显示剩余4条评论

6

MinGW-w64目前支持使用VS2013分发的UWP C运行时进行实验性支持。与通用的VS2013 crt链接的C dll也可以与VS2015和VS2017 UWP工具链一起使用(UWP项目应该依赖于“Microsoft Visual C++ 2013 Runtime Package for Windows Universal”)。
MinGW-w64提供了winstorecompat库,用于在UWP平台上替换某些被禁止的API调用为用户定义的实现。在链接到系统库之前,winstorecompat应该被链接到用户的库中。
此外,需要使用自定义标志-Wl,--dynamicbase构建MinGW C dll以通过Windows 10 Store认证工具的安全检查,并设置appcontainer位标志以与Windows 10 Store二进制要求兼容。
这里是我处理过的示例项目link,演示如何将纯C MinGW Dll消耗到Windows 10 C# UWP应用程序中,使用C dll中的PInvoke方法并通过认证工具安全检查以发布到Windows Store。我参考了libVLC WinRT构建实现。

不错!我喜欢它,我已经给你的仓库点了赞。我知道这是你的仓库,因为你要求反馈,但也许你应该在回答中明确说明。有些人会因为自我推广而投反对票,除非事先声明。 - Prof. Falken
@Prof.Falken,明白了,谢谢。实际上,我更感兴趣的是是否有人会尝试在应用商店中发布真正的应用程序来使用它。认证工具包对于示例UWP应用程序包没有显示任何问题,但通常可能会出现其他问题... - Max Go
1
我稍后会在回答中提供更多技术细节。 - Max Go

3

使用clang编译器而非MinGW来使用C++/WinRT:

https://github.com/Microsoft/cppwinrt
https://moderncpp.com/

"C++/WinRT是一个标准的C++语言投影,仅通过头文件实现Windows Runtime。它允许您使用任何符合标准的C++编译器编写和消费Windows Runtime API."

"C++/WinRT依赖于C++17语言特性,因此您需要告诉C++,您的项目需要使用C++17语言标准。"

"虽然Visual C++仍然是我们的主要目标,但我们使用Clang作为我们的次要编译器以确保标准符合性。在这个更新中,进行了许多小的更改来支持Clang构建并修复仅在Clang构建中发现的正确性错误。"


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