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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lee_ham/article/details/81778581

智能推荐

Ubuntu安装jdk8_ubuntu安装openjdk-8-jdk-headless-程序员宅基地

文章浏览阅读307次。下载openjdk-8-jre-headless输入命令:sudo apt install openjdk-8-jre-headless下载openjdk-8-jdk-headless输入命令:sudo apt install openjdk-8-jdk-headless配置环境变量export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64ex..._ubuntu安装openjdk-8-jdk-headless

什么是信号完整性_信号完整性是什么-程序员宅基地

文章浏览阅读640次。信号完整性研究:什么是信号完整性?如果你发现,以前低速时代积累的设计经验现在似乎都不灵了,同样的设计,以前没问题,可是现在却无法工作,那么恭喜你,你碰到了硬件设计中最核心的问题:信号完整性。早一天遇到,对你来说是好事。 在过去的低速时代,电平跳变时信号上升时间较长,通常几个ns。器件间的互连线不至于影响电路的功能,没必要关心信号完整性问题。但在今天的高速时代,随着IC输出开关速度的提_信号完整性是什么

2022-01-19每日刷题打卡_输入有多组测试数据. 每组测试数据以两个非零整数 m 和 n 开始,两者均不大于 20。-程序员宅基地

文章浏览阅读810次。2022-01-19每日刷题打卡一本通1256:献给阿尔吉侬的花束【题目描述】阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫。今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪。现在研究员们想知道,如果阿尔吉侬足够聪明,它最少需要多少时间就能吃到奶酪。迷宫用一个R×C的字符矩阵来表示。字符S表示阿尔吉侬所在的位置,字符E表示奶酪所在的位置,字符#表示墙壁,字符.表示可以通行。阿尔吉侬在1个单位时间内可以从当前的位置走到它上下左_输入有多组测试数据. 每组测试数据以两个非零整数 m 和 n 开始,两者均不大于 20。

go test 使用 和 我遇到的坑_go test calc_test.go calc.go 失败-程序员宅基地

文章浏览阅读1.2k次。网上很多go test的教程,但是写得都不好,尤其对新手不友好。现在同目录下有两个文件:calc.go 和 calc_test.go,现在就来讲一讲具体操作。calc.go 内容如下package mainfunc Add(a int, b int) int { return a + b + 1}func Mul(a int, b int) int { return a * b}func GetSumOut(n int) (sum int) { for i :_go test calc_test.go calc.go 失败

【LetsEncrypt】ssl证书完全自动化续签_letsencrypt自动续签-程序员宅基地

文章浏览阅读4.1k次。ssl证书如果用到很多个,手动更新将会比较烦,并且免费的LetsEncrypt 90天就要更新一次,总不能今天更新完了,明天或下周又要更新,如果能让它自动更新岂不美哉?实践证明,这是行得通的。首先,ssl证书我目前有2个用途,一个是自己服务器的nginx需要,nginx配置文件写好证书路径即可,每次获取到新的证书,nginx 需要重新加载配置文件,nginx -s reload。另一个用途是获取到证书之后上传给阿里云CDN使用,因为CDN开了https,上传证书通过CDN SDK的接口上传而不是手动。._letsencrypt自动续签

好纠结啊,JEECG 商业版本和开源版本有什么区别呢_jeecgboot商业版多少钱-程序员宅基地

文章浏览阅读2.1w次。好纠结啊,JEECG 商业版本和开源版本有什么区别呢_jeecgboot商业版多少钱

随便推点

超图GIS入门iserver搭建,前端调用iserver加载三维场景demo-程序员宅基地

文章浏览阅读3.5k次,点赞7次,收藏41次。目录前言一.GIS介绍,为什么选择它?二.环境安装三.调用三维GIS场景设置地图风格添加地图iServer服务前言前段时间因为对3D制图感兴趣,学习了一下国内制作GIS的公司产品技术,并以一个demo为示例演示从制作一个三维场景地图——>安装iserver服务——>发布制作的地图——>最后通过前端加载地图显示操作等分为几个步骤来逐步讲解。GIS介绍,为什么选择它?..._超图gis入门iserver搭建,前端调用iserver加载三维场景demo

超详细的 Mybatis 插件开发指南!-程序员宅基地

文章浏览阅读3.6k次,点赞2次,收藏15次。点击上方 "程序员小乐"关注,星标或置顶一起成长每天凌晨00点00分,第一时间与你相约每日英文Strive to make every day happy and m..._mybatis插件编写

2个阶乘什么意思_阶乘是什么意思?-程序员宅基地

文章浏览阅读2.3k次。展开全部阶乘释义:从1到n的连续自然数相乘的积、叫做32313133353236313431303231363533e58685e5aeb931333365656535阶乘、用符号n!表示。如5!=1×2×3×4×5。规定0!=1。拓展资料:阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号,是数学术语。一个正整数的阶乘(factorial)是所..._阶乘的阶乘是什么意思

iOS7 和Xcode 5相关代码资源及示例_xcode 示例代码-程序员宅基地

文章浏览阅读249次。注意下面的资源都是基于iOS7 和Xcode 5,最近将大量上传大量文章,1.马上着手开发应用程序系列 http://download.csdn.net/detail/langyifei/6590585 ,注意该材料是英文版2. 探险游戏 由于该游戏代码达到60多M,无法上传。所以需要根据书中的邮箱地址来,索取 利用Sprite工具包(Kit)工具包轻松打造令人信服的、 高性能的游_xcode 示例代码

ubuntu安装源更改为aliyun_ubuntu 換成aliyun後更新缓存是什么意思-程序员宅基地

文章浏览阅读3.3k次。sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak #备份sudo vim /etc/apt/sources.list #修改sudo apt-get update #更新列表deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe mu_ubuntu 換成aliyun後更新缓存是什么意思

SM2259XT2量产固件实战教程,SM2259XT2开卡量产工具,DIY+简单测试SM2259XT2+384G B0KB的固态-程序员宅基地

文章浏览阅读1.9k次,点赞9次,收藏7次。SM2259XT2是慧荣系固态硬盘常用的主控型号,而对于我们热爱DIY的人来说,免不了用量产工具来对SSD进行开卡了,本文介绍从量产部落下载SM2259XT2量产固件下载方法,以及简单测试一个自制的SM2259XT2+384G B0KB的固态。_sm2259xt2