MinGW试图实现一种本地方式在Windows上编译C++,但它不支持一些功能,比如
mutex
和threads
。我们有MinGW-W64,它是MinGW的一个分支,支持这些功能,我想知道,应该使用哪一个?考虑到GCC是最常用的C++编译器之一。还是在Windows上使用MSVC(VC++),在Linux上使用GCC,并使用CMake来处理独立的编译器?
提前感谢您的帮助。
mutex
和threads
。个人而言,我更喜欢基于MinGW的解决方案,可以在Linux上进行交叉编译,因为有很多平台无关的库在Windows上几乎不可能(或非常麻烦)构建。(例如那些使用./configure
脚本设置其构建环境的库。)但是,即使在Linux上,交叉编译所有这些库及其依赖也是很烦人的,如果您必须自己进行./configure
和make
。这就是MXE的用武之地。
从评论中看来,您好像担心依赖项。当进行交叉编译时,如果您必须逐个交叉编译每个库,则在构建环境设置方面会很耗费成本。但是有MXE可用。它构建了一个交叉编译器和大量平台无关的库(如boost、QT和许多不太重要的库)。使用MXE,boost作为解决方案变得更加具有吸引力。我已经使用MXE构建了一个依赖于Qt、boost和libexiv2的项目,几乎没有遇到问题。
首先安装mxe:
git clone -b master https://github.com/mxe/mxe.git
然后构建您想要的软件包(gcc
和 boost
):
make gcc boost
If you want to use C++11 threads with MXE, it is possible but requires a two-stage compilation of gcc.
Firstly, check out the master (development) branch of mxe (this is the normal way to install it):
git clone -b master https://github.com/mxe/mxe.git
然后无需修改即可构建gcc
和winpthreads
:
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::thread
和std::mutex
,没有代码使用WINAPI线程,因此它们添加了一个预处理器块,当启用Win32线程时,从库中剥离std::thread
和std::mutex
。通过使用--enable-threads=posix
和winpthreads库,而不是让GCC尝试在其库中与Win32进行接口,因为它并没有完全支持,我们让winpthreads充当胶水代码,为GCC提供正常的pthread接口,并使用WINAPI函数来实现pthread库。
您可以通过向make
命令添加-jm
和JOBS=n
来加快这些编译速度。其中-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
-march
),交叉编译的可执行文件与本地编译的一样好。您应该了解如何使用mxe交叉编译cmake项目,并可能在SO上提出新问题。 - Tylerclass Thread
,如下所示。class Thread
{
public:
explicit Thread(int (*pf)(void *arg));
void run(void *arg);
int join();
void detach();
...
+src
|---thread.h
|--+win
|--|---thread.cpp
|--+linux
|--|---thread.cpp
win/thread.cpp
,并在Linux上编译linux/thread.cpp
。<thread>
,因为MinGW不支持它,但感谢您的想法,很有趣,我会尝试一下。 - SH.0x90std::thread
被禁用。使用winpthreads和POSIX线程模型,它可以使用std::thread
。即使对于gcc 4.9也是如此。有关更多信息,请参见我的答案。 - Tyler你应该一定要使用Boost。它非常好用,可以完成所有的任务。
如果你不想使用Boost.Thread不支持的某些同步原语(例如std::async
),请查看Boost库。当然,这是额外的依赖关系,但如果你不害怕这个,你将享受Boost的所有优势,如交叉编译。
了解Boost.Thread和C++11线程之间的差异在这里。
我认为这是一个相当通用的考虑因素列表,当你需要选择多平台工具或工具集时,其中很多你可能已经有了答案;
我看到的一件事似乎并没有真正处理;
目标应用程序期望什么?
您提到正在构建一个库,那么将使用它的应用程序是什么,那个应用程序期望什么。
这里的限制是目标应用程序决定了系统最基本的方面,即用于构建它的工具。 应用程序将如何使用库;
考虑到这些因素,以及可能的事实是目标应用程序仍然未知;尽可能保持灵活性。在这种情况下,努力与gcc
、mingw-w64
和msvc
保持兼容性。它们都提供广泛的C++11
语言支持(确实,有些比其他人更多),并且通常受到其他流行库的支持(即使现在不需要这些其他库)。
我认为Hans Passant的评论...
先做有效的事情
... 真的适用于这里。
既然你提到了它,mingw-builds
可以为 mingw-w64
提供支持 thread
等功能,使用Windows的 posix
构建,同时支持 64位 和 32位。