MinGW到底是什么?ghost 0.什么是MinGW MinGW,即 Minimalist GNU For Windows。它是一些头文件和端口库的集合,允许人们在没有第三方动态链接库的情况下使用 GCC(GNU Compiler C)产生 Windows32 程序。
实际上 MinGW 并不是一个 C/C 但是一套编译器 GNU 工具集合 GCC (GNU 编译器集合) 以外,MinGW 还包一些其他的 GNU 程序开发工具 (比如 gawk bison 等等)。
开发 MinGW 那些不喜欢工作的人 Linux(FreeBSD) 保留操作系统 Windows 提供一套符合的人 GNU 的 GNU 工作环境。
1.MinGW安装 下载MinGW;下载后,我们会得到一个 mingw-get-setup.exe 名称安装包,双击打开即可安装。 运行 minGW installer。有很多选择可供选择。当时我有点着迷。我不知道该选哪一个???事实上,我现在不知道。我根据网上别人说的选择……有缺点,也有赘余 配置环境变量 进入cmd;输入gcc -v;如果能看到版本信息,就安装好了GCC了。 3.MinGW与Cygwin:原理与比较 MingW 与 Cygwin
首先 MinGW 和 Cygwin 可用于跨平台开发。
MinGW 是 Minimalistic GNU for Windows 缩写,也就是 Win 版的 GCC。
Cygwin 是全面模拟Linux该接口为运行在其上的程序提供了大量现成的软件,更像是一个平台。
相对的 MingW 也有一个叫 MSys(Minimal SYStem)子项目主要提供模拟 Linux 的 Shell 还有一些基本的 Linux 工具。因为编译一个大程序,仅仅依靠一个 GCC 还不够,还需要有 Autoconf 等工具配置项目,所以一般在 Windows 下编译 ffmpeg 等 Linux 以下大型项目均通过Msys 来完成,当然 Msys 只是辅助环境,基本工作还是 MingW 来做的。
基本原理 修改编译器,让 Window 如下面的编译器 fork 调用翻译成等价形式,即 MingW 的做法. 修改库,让 Window 提供类似 UNIX 他们对程序的界面提供的库就像 UNIX 同样,这些库当然是由 win32 的 API 这就是实现的 Cygwin 的做法. 用 MingW 和 Cygwin 编译程序的区别 首先 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 文件。
但 Cygwin 对 Linux 模拟相对完整,甚至有一个 Cygwin X 可直接使用的项目 Cygwin 跑 X。
另外 Cygwin 可以设置 -mno-cygwin 的 flag,来使用 MingW 编译。
而与 Cygwin 更具可比性 MSys 上面的工具也是通过的 Cygwin 提供这种模拟方法。
总之,如果这两个项目有千丝万缕的关系,一个不恰当的例子 Mingw 是 MFC,Cygwin 就是 .NET 了。
4.Windows平台上使用MinGW编译Linux程序 1.下载安装mingw32 2.将mingw下bin和msys\1.0下bin设置为系统path 3.启动msys.bat 4.cd到项目目录 5.输入./configure 6.输入make 7.输入make install 8.cd C:\MinGW\msys\1.0\local\lib 9.ar x ***.a 10.ar r *.lib,头文件在C:\MinGW\msys\1.0\local\include
5.Windows上调用MinGW函数库的编译 静态库函数 静态库扩展名一般为.lib(windows上)或.a(linux上),他和动态库(dll)有区别。调用静态库编译后,将写入执行程序。然后就可以独立运行了。动态库旨在动态调用,调用时需要加载dll可以正常工作(所以动态库可以在功能升级时提供补丁或使用,但运行速度需要商业协会)。另外,两个库的编译器也不一样,比如mingw用g 生成动态库*.dll, 用ar生成静态库*.a;而VC则一律用link.exe生成动态和静态库,使用options区分产生什么。
示例 以下是一些C 和C文件在MinGW将其编译成静态库函数文件Windows调用此库函数。
假设我们有两个库函数文件myf1.cpp和myf2.c
//myf1.cpp #include <stdio.h> void f1_Fonction1(int a, double b, char *c) { printf(调用文件myf1.cpp的f1_Fonction1成功\n”); } int f1_Fonction2(int c) { printf(调用文件myf1.cpp的f1_Fonction2成功\n”); return c 1; }
//myf2.c #include <stdio.h> void f2_Fonction1(void) { printf(调用文件myf2.c的f2_Fonction1成功\n”); } int f2_Fonction2(int c) { printf(“调用文件myf2.c的f2_Fonction2成功\n”); return c 2; }
上述两份文件中有一份是C 是的,另一个是C。两个文件各提供两个函数。 首先我们用gcc命令将他们编译成目标文件myf1.o和myf2.o
gcc -c myf1.cpp myf2.c 1 接着使用ar命令生成静态库 mylib.lib
ar r mylib.lib myf1.o myf2.o 1 现在,我们试试windows试试这个库中的函数。写一个简单的调用C 程序main.cpp
//main.cpp #include using namespace std; void f1_Fonction1(int a, double b, char *c); int main() { char c; f1_Fonction1(1,2.0,&c); //调用了myf1里面的函数f1_Fonction cout << “Hello world!” << endl; return 0; }
然后用MinGW编译,先生成main.o文件
gcc -c main.cpp 1 接着把main.o和函数库mylib.lib连接生成main.exe文件
g -o main.exe main.o mylib.lib 1 什么是GNU GNU计划,又称革奴计划,由Richard Stallman公开发行于1983年9月27日。其目标是建立一个完全自由的操作系统。
GNU是“GNU is Not Unix递归缩写。Stallman宣布GNU应当发音为Guh-NOO以避免与new混淆这个词(注:Gnu英语中原意为非洲牛羚,发音和new相同)。UNIX是一种广泛使用的商业操作系统的名称。由于GNU将要实现UNIX因此,系统的接口标准,GNU可分别开发不同的操作系统部件。GNU该计划使用了一些当时可以自由使用的软件,例如TeX排版系统和X Window视窗系统等。不过GNU该计划还开发了大量其他自由软件。 ———————————————— 版权声明:本文为CSDN博主「leehaming」遵循原创文章CC 4.0 BY-SA版权协议,载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/lee_ham/article/details/81778581