MinGW CygWin cross-compilation conclusion

MinGW / CygWin 交叉编译总结

主要有两类方法:

1、minGW cygWin等模拟了linux相关系统库对应windows中的实现,可以无需改动代码,但其中CygWin编译生成的程序要运行于windows还需额外的动态链接库cygwin1.dll等,效率上有些区别,而MinGW通过静态链接可以直接生成windows下运行的二进制文件。CygWin相当于通过动态链接模拟了Windows下的Linux运行环境,更彻底,更全面,而MinGW改动了GCC等编译工具以使之符合Windows平台,故而运行库是MSVCR等windows原生链接库。而mingw通常配合使用的msys则是模拟了linux的命令行。

2、直接在vs新建工程,用宏定义将所有平台相关的代码进行条件编译,也可以用宏定义将某个平台的函数替换成另一个平台的函数,以此使代码更简洁

More Detailed Introduction:

CygWin:  【Highlights of Cygwin Functionality】 Highlights of Cygwin Functionality

MinGW:  【 About Installation Settingshttps://www.cnblogs.com/ggg-327931457/p/9694516.html

MinGW & MinGW-W64 【 MinGW & MinGW-W64  】https://www.cnblogs.com/foohack/p/3877276.html

MinGW & MinGW-W64 & MYSYS .etc  https://bitbucket.org/FrankHB/yslib/src/50c3e6344a5a24b2382ce3398065f2197c2bd57e/doc/Workflow.Annual2014.txt?at=master&fileviewer=file-view-default

MinGW是个什么GHOST】 https://blog.csdn.net/lee_ham/article/details/81778581?utm_source=blogxgwz5

首先 MingW 和 Cygwin 都不能让 Linux 下的程序直接运行在 Windows 上,必需通过源代码重新编译。现代操作系统包括 Windows 和 Linux 的基本设计概念像进程线程地址空间虚拟内存这些都是大同小异的,之所以二者上的程序不能兼容,主要是它们对这些功能具体实现上的差异,首先是可执行文件的格式,Window 使用 PE 的格式,并且要求以 .EXE 为后缀名。Linux 则使用 Elf。其次操作系统的 API 也不一样,如 Windows 用 CreateProcess() 创建进程,而 Linux 使用 fork()。所以要移植程序必然要在这些地方进行改变,MingW 有专门的 W32api 头文件,来把代码中 Linux 方式的系统调用替换为对应的 Windows 方式。而 Cygwin 则通过 cygwin1.dll 这个文件来实现这种 API 的转换,并模拟一个 Linux 系统调用接口给程序,程序依然以 Linux 的方式调用系统 API,只不过这个 API 在 cygwin1.dll 上,cygwin1.dll 再调用 Windows 对应的实现,来把结果返回给程序。可以用查看他们编译好的程序的导入表来验证这点。二者生成的程序都是能在 Windows 上运行的 EXE 文件,显然都是 PE 格式,用一个PE格式查看工具检查一下就能发现,Cygwin 生成的程序依然有 fork() 这样的 Linux 系统调用,但目标库是 cygwin1。而 MingW 生成的程序,则全部使用从 KERNEL32 导出的标准 Windows 系统 API。

这样看来用 MingW 编译的程序性能会高一点,而且也不用带着那个接近两兆的 cygwin1.dll 文件。

MinGW,是Minimalist GNUfor Windows的缩写。它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你在GNU/Linux和Windows平台生成本地的Windows程序而不需要第三方C运行时(C Runtime)库。MinGW 是一组包含文件和端口库,其功能是允许控制台模式的程序使用微软的标准C运行时(C Runtime)库(MSVCRT.DLL),该库在所有的 NT OS 上有效,在所有的 Windows 95发行版以上的 Windows OS 有效,使用基本运行时,你可以使用 GCC 写控制台模式的符合美国标准化组织(ANSI)程序,可以使用微软提供的 C 运行时(C Runtime)扩展,与基本运行时相结合,就可以有充分的权利既使用 CRT(C Runtime)又使用 WindowsAPI功能。

区别:http://www.cnblogs.com/flyinggod/p/8048224.html  MinGW是一套Windows环境下GNU编译组件的接口,通俗的可以说是Win上的gcc 。比起MinGW,也许那只企鹅CygWin更加著名一些,实现的效果也差不多,但事实上两者的原理是不同的。Cygwin通过一个中间层的动态链接库来实现Win API和Cygwin的连接,好处是应用在Linux与Win之间移植更加方便,风格更加一致,缺点是发布应用时一定要带上Cygwin的环境动态库,应用执行效率也略微有点低;MinGW则使用静态链接的方式,生成的应用更加本地化,不需要依赖任何第三方的C/C++ RT动态链接库,仅依赖Win自身的运行环境,应用执行效率也稍高。当然现在这两家也开始有了一些功能的互补,总而言之可以相互作为替代品使用。

MSYS的全称叫Minimal SYStem,是MinGW的一个子系统,是一套运行在Windows上的bash,也就是运行在Win上的Linux Terminal [1]。这个比较好理解,其实就是在Win上使用Linux的命令行进行操作,可以代替cmd来使用。对一些GNU的开源软件,MSYS可能是必需的,因为它们通常需要./configure然后make才能运行(学Linux的童鞋应该非常熟悉这个流程了)[2]。我们将MSYS和MinGW配合使用就可以打造出一个Win下的GNU命令行终端和编译系统。

要注意的问题:

跨平台的文本编码问题,linux和windows下换行符的不同,最好用UTF8编码,\r\n的换行方式进行统一

About Predefined MACRO:

C/C++跨平台的预编译宏【C/C++跨平台的的预编译宏】  https://blog.csdn.net/earbao/article/details/53307432

error C1071: 在注释中遇到意外的文件结束

该问题的可能原因有编码不兼容、正文中包含中文注释且注释采用/**/ 方式标注(改成//可解决该问题),括号未正确关闭, 类定义后缺少分号等。

 error: ‘mutex’ in namespace ‘std’ does not name a type:

 error: ‘mutex’ is not a member of ‘std’:

安装MinGW 的时候要选择posix 线程模型以支持C++11 thread: threads-posix发行版将使用 posix API并允许使用 std:: thread,threads-win32将使用 win32api,并禁用标准的std::thread 部分,

【 mingw-w64线程模型:posix vs win32(posix允许使用c++11的std:: thread,但要带一个winpthreads,可能需要额外dll) 】

https://stackoverflow.com/questions/17242516/mingw-w64-threads-posix-vs-win32

0

发表评论