必威体育Betway必威体育官网
当前位置:首页 > IT技术

MinGW到底是个什么ghost

时间:2019-10-06 06:44:33来源:IT技术作者:seo实验室小编阅读:59次「手机版」
 

mingw

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 *.o
即生成***.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

接着使用ar命令生成静态库 mylib.lib

ar r mylib.lib myf1.o myf2.o

现在,我们尝试在windows上调用这个库中的一个函数试试看。写一个简单的调用的C++程序main.cpp

//main.cpp
#include <iOStream>
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

接着把main.o和函数库mylib.lib连接起来生成main.exe文件

g++ -o main.exe main.o mylib.lib

什么是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计划也开发了大批其他的自由软件。

相关阅读

分享到:

栏目导航

推荐阅读

热门阅读