MinGW与MinGW-W64对比交叉编译中的MSVC(VC++)

SH.*_*x90 5 c++ gcc mingw visual-c++ mingw-w64

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

MinGW尝试实现一种在Windows上编译C++的本机方式,但它不支持像mutex和等一些功能threads.

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

提前致谢.

Tyl*_*ler 8

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

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

使用MXE增强线程

为此,首先安装mxe:

git clone -b master https://github.com/mxe/mxe.git
Run Code Online (Sandbox Code Playgroud)

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

make gcc boost
Run Code Online (Sandbox Code Playgroud)

带有MXE的C++ 11线程

如果您仍然更喜欢C++ 11线程,那么MXE也是如此,但它需要两阶段编译gcc.

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

git clone -b master https://github.com/mxe/mxe.git
Run Code Online (Sandbox Code Playgroud)

然后构建gcc并且winpthreads不做修改:

make gcc winpthreads
Run Code Online (Sandbox Code Playgroud)

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

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

make gcc
Run Code Online (Sandbox Code Playgroud)

注意:您必须这样做,因为默认配置使用WINAPI而不是posix pthreads支持Win32线程.但GCC的的libstdc ++,实现了图书馆std::threadstd::mutex,没有代码使用WINAPI线程,因此他们增加一个预处理块条std::threadstd::mutex从库时的Win32线程启用.通过使用--enable-threads=posix和winpthreads库,我们让winpthreads作为粘合代码,为GCC提供正常的pthreads接口,使用和使用于实现pthreads库的函数.

最后的说明

您可以通过添加多达这些速度汇编-jmJOBS=nmake命令.-jm,其中m一个数字表示同时构建m包.JOBS=n,其中n一个数字表示使用n构建每个包的流程.因此,实际上,它们是相乘的,因此只选择m,n因此m*n最多不会超过您拥有的处理器核心数.例如,如果你有8个核心,那么m=3,n=4将是正确的.

引文

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


ikh*_*ikh 5

如果您想要可移植性,请使用标准方法 - C++ 11的<thread>库.

如果你不能使用C++ 11,pthread可以是解决方案,虽然VC++无法编译它.

你想不要同时使用这两种吗?然后,只需编写抽象的线程层.例如,你可以class Thread像这样写.

class Thread
{
public:
   explicit Thread(int (*pf)(void *arg));
   void run(void *arg);
   int join();
   void detach();
   ...
Run Code Online (Sandbox Code Playgroud)

然后,编写要支持的每个平台的实现.例如,

+src
|---thread.h
|--+win
|--|---thread.cpp
|--+linux
|--|---thread.cpp
Run Code Online (Sandbox Code Playgroud)

之后,配置您构建脚本以win/thread.cpp在Windows和linux/thread.cppLinux上编译.

  • 这取决于编译gcc时启用的线程模型.默认情况下,mingw使用libstdc ++(gcc的标准库)不支持的win32线程模型,因此`std :: thread`被禁用.使用winpthreads和POSIX线程模型,它可以使用`std :: thread`.即使对于gcc 4.9也是如此.有关详细信息,请参阅我的回答. (2认同)