MinGW尝试实现在Windows上编译C ++的本机方式,但它不支持某些功能,如mutex
和threads
。
我们有MinGW-W64是支持这些功能的MinGW的分支,我想知道哪一个使用?知道GCC是最常用的C ++编译器之一。或者最好在Linux上使用MSVC(VC ++),在Linux上使用GCC,并使用CMake处理独立编译器?
提前致谢。
答案 0 :(得分:7)
就个人而言,我更喜欢基于MinGW的解决方案,它可以在Linux上进行交叉编译,因为有许多平台独立的库几乎不可能(或者是一个庞大的PITA)在Windows上构建。 (例如,使用./configure
脚本来设置其构建环境的那些。)但是,如果必须./configure
和{{1},即使在Linux上交叉编译所有这些库及其依赖项也很烦人。他们每个人自己。这就是MXE的用武之地。
从评论中,您似乎担心依赖性。如果必须单独交叉编译每个库,那么在交叉编译时,它们在构建环境设置方面成本很高。但是有MXE。它构建了一个交叉编译器和大量独立于平台的库(如boost,QT和许多不太值得注意的库)。使用MXE,作为解决方案,提升变得更具吸引力。我已经使用MXE来构建一个依赖于Qt,boost和libexiv2的项目,几乎没有问题。
要执行此操作,请先安装mxe:
make
然后构建您想要的包(git clone -b master https://github.com/mxe/mxe.git
和gcc
):
boost
如果您仍然喜欢C ++ 11线程,那么MXE也可以这样做,但它需要两阶段编译gcc。
首先,检查mxe的主(开发)分支(这是安装它的常规方法):
make gcc boost
然后构建git clone -b master https://github.com/mxe/mxe.git
和gcc
而不做任何修改:
winpthreads
现在,编辑mxe / src / gcc.mk。找到以make gcc winpthreads
开头的行,并将$(PKG)_DEPS :=
添加到该行的末尾。然后找到winpthreads
并将其替换为--enable-threads=win32
。
现在,重新编译--enable-threads=posix
并享受您的C ++ 11主题。
gcc
注意:您必须这样做,因为默认配置使用WINAPI而不是posix pthreads支持Win32线程。但GCC的libstdc ++,即实现make gcc
和std::thread
的库,没有使用WINAPI线程的代码,因此它们添加了一个预处理器块,用于从std::mutex
和std::thread
中删除启用Win32线程时的库。通过使用std::mutex
和winpthreads库,我们让winpthreads作为粘合代码,为GCC提供正常的pthreads接口,而不是让GCC尝试在它的库中与Win32接口。使用并使用WINAPI函数来实现pthreads库。
您可以通过向--enable-threads=posix
命令添加-jm
和JOBS=n
来加快这些编辑速度。 make
,其中-jm
是一个数字,表示同时构建m
个包。 m
,其中JOBS=n
是一个数字,表示使用构建每个包的n
进程。实际上,它们是相乘的,所以只选择n
和m
,这样n
最多不会超过您拥有的处理器核心数。例如。如果你有8个核心,那么m*n
,m=3
就是正确的。
http://blog.worldofcoding.com/2014_05_01_archive.html#windows
答案 1 :(得分:5)
如果您想要可移植性,请使用标准方法 - <thread> C ++ 11库。
如果你不能使用C ++ 11,pthread可以是解决方案,虽然VC ++无法编译它。
你想不要同时使用这两种吗?然后,只需编写抽象的线程层。例如,您可以像这样写class 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
之后,配置构建脚本以在Windows上编译win/thread.cpp
,在linux上编译linux/thread.cpp
。
答案 2 :(得分:1)
你绝对应该使用Boost。它真的很棒,可以做所有事情。
说真的,如果您不想使用Boost.Thread不支持的某些同步原语(例如std::async
),请查看Boost库。当然这是一个额外的依赖,但如果你不害怕这一点,你将享受Boost的所有优势,如交叉编译。
了解Boost.Thread与C ++ 11主题here之间的差异。
答案 3 :(得分:0)
我认为当您需要选择多平台工具或工具集时,这是一个相当通用的注意事项列表,对于很多这些工具或工具集,您可能已经有了答案;
我看到的一件事似乎并未真正处理过;
目标应用程序的期望是什么?
你提到你正在构建一个库,那么应用程序将使用它以及应用程序所期望的
。这里作为目标应用程序的约束决定了系统最基本的方面,即用于构建它的工具。应用程序如何使用该库;
鉴于这些,以及目标应用程序可能仍然未知的可能事实;保持尽可能多的灵活性。在这种情况下,请尽量保持与gcc
,mingw-w64
和msvc
的兼容性。它们都提供广泛的C++11
语言支持(真的,比其他人更多)并且通常得到其他流行的库的支持(即使现在不需要这些其他库)。
我认为Hans Passant的评论......
做什么先行
......确实在这里适用。
既然你提到过; mingw-builds
的{{1}}支持mingw-w64
等,thread
在Windows上构建,64 bit和32 bit。