gpt4 book ai didi

c++ - 交叉编译中的 MinGW vs MinGW-W64 vs MSVC (VC++)

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:57:46 29 4
gpt4 key购买 nike

让我们这样说:我们要创建一个需要跨平台的库,我们选择 GCC 作为编译器,它在 Linux 上运行得非常好,我们需要在 Windows 上编译它,我们有 MinGW 来完成这项工作.

MinGW 试图实现一种在 Windows 上编译 C++ 的 native 方式,但它不支持某些功能,例如 mutexthreads

我们有 MinGW-W64,它是支持这些功能的 MinGW 的一个分支,我想知道该使用哪个?知道GCC是最常用的C++编译器之一。还是在Windows上用MSVC(VC++),在Linux上用GCC,用CMake独立编译器处理?

提前致谢。

最佳答案

就个人而言,我更喜欢在 Linux 上交叉编译的基于 MinGW 的解决方案,因为有许多平台独立库几乎不可能(或巨大的 PITA)在 Windows 上构建。 (例如,那些使用 ./configure 脚本来设置他们的构建环境的人。)但是即使在 Linux 上交叉编译所有这些库及其依赖项也很烦人,如果你必须 ./自己配置制作。那就是MXE进来了。

从评论来看,您似乎担心依赖关系。如果您必须单独交叉编译每个库,那么在交叉编译时,它们在构建环境设置方面的成本很高。但是有MXE。它构建了一个交叉编译器和大量平台独立库(如 boost、QT 和许多不太知名的库)。使用 MXE,boost 作为一种解决方案变得更具吸引力。我已经使用 MXE 构建了一个依赖于 Qt、boost 和 libexiv2 的项目,几乎没有任何问题。

使用 MXE 提升线程

为此,首先安装 mxe:

git clone -b master https://github.com/mxe/mxe.git

然后构建你想要的包(gccboost):

make gcc boost

带有 MXE 的 C++11 线程

如果您仍然喜欢 C++11 线程,那么 MXE 也可以,但它需要 gcc 的两阶段编译。

首先,检查 mxe 的主(开发)分支(这是安装它的正常方法):

git clone -b master https://github.com/mxe/mxe.git

然后不加修改地构建gccwinpthreads:

make gcc winpthreads

现在,编辑 mxe/src/gcc.mk。找到以 $(PKG)_DEPS := 开头的行,并将 winpthreads 添加到该行的末尾。并找到 --enable-threads=win32 并将其替换为 --enable-threads=posix

现在,重新编译 gcc 并享受您的 C++11 线程。

make gcc

注意:您必须这样做,因为默认配置支持使用 WINAPI 而不是 posix pthreads 的 Win32 线程。但是 GCC 的 libstdc++,即实现 std::threadstd::mutex 的库,没有使用 WINAPI 线程的代码,所以他们添加了一个预处理器 block 来剥离std::threadstd::mutex 启用 Win32 线程时来自库。通过使用 --enable-threads=posix 和 winpthreads 库,而不是让 GCC 尝试在它的库中与 Win32 接口(interface),它不完全支持,我们让 winpthreads 充当胶水代码它为 GCC 提供了一个普通的 pthreads 接口(interface),并使用 WINAPI 函数来实现 pthreads 库。

最后的说明

您可以通过将 -jmJOBS=n 添加到 make 命令来加快这些编译速度。 -jm,其中m是一个数字,表示并发构建m个包。 JOBS=n,其中n 是一个数字,表示使用n 进程构建每个 包。因此,实际上,它们相乘,所以只选择 mn,这样 m*n 最多不会超过你拥有的处理器核心。例如。如果你有 8 个内核,那么 m=3n=4 就差不多了。

引用

http://blog.worldofcoding.com/2014_05_01_archive.html#windows

关于c++ - 交叉编译中的 MinGW vs MinGW-W64 vs MSVC (VC++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24417906/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com