gcc教程(windows版本)

1. GCC安装

1.1 什么是 GCC

GCC 是 GNU 编译器套装的简称(GNU Compiler Collection),一套编程语言编译器,以 GPL 及 LGPL 许可证所发行的自由软件,也是 GNU 项目的关键部分,也是 GNU 工具链的主要组成部分之一。GCC(特别是其中的 C 语言编译器)也常被认为是跨平台编译器的事实标准。
知乎:Cygwin 和MinGW 的区别与联系是怎样的?

1.2 安装 MinGw

1.2.1. 下载 MinGW

注意!安装mingw必须搭配msys(如果安装cygwin,则不需要),推荐mingw64+msys1

mingw(32位)

http://sourceforge.net/projects/mingw/files/latest/download?source=files

mingw(64位)

http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/installer/mingw-w64-install.exe/download

1.2.2. 安装

下载完毕后,我们会得到一个 mingw-get-setup.exe 名字的安装包,双击打开即可安装。
在这里插入图片描述
安装目录可以自己选择,完后选择 Continue 按钮安装,安装完后会在桌面得到一个 MinGW Installer 的可执行程序,如图所示:
在这里插入图片描述
按照上图选择勾选这四项,完后选择 Installation --> Apply changes,如图所示:
在这里插入图片描述
完后选择 Apply 按钮即可安装。

1.2.3. 64位配置图

在这里插入图片描述

mingw64配置图详解

有5个选项

  • Version(gcc版本),选择最高的

  • Architecture(架构),32位cpu选择i686,64位cpu选择x86_64

  • Threads(线程模式),如果使用posix api 选择posix,如果使用win32 api 选择win32

  • Exception(异常处理机制,有三种)

    1. SJLJ (setjmp/longjmp)
      优点,兼容性好,32位或64位架构都可以使用
      缺点,速度较慢

    2. DWARF (DW2, dwarf-2)
      优点,速度比SJLJ快
      缺点,只能用于32位架构,且有bug!(尽量别用!!!)

    3. SEH (zero overhead exception)
      优点,速度快
      缺点,只能用于64位架构

  • Build revision(编译版本),选择最高的

2. 安装MSYS(运行在windows上的小型linux环境)

2.1 下载msys1

下载地址: http://sourceforge.net/projects/mingwbuilds/files/external-binary-packages/ (第三方)
在这里插入图片描述
在该下载页面中,应该下载的是下图中README.txt下面的压缩包文件,而非‘Download mingw-builds-install.exe’。

http://downloads.sourceforge.net/mingw/MSYS-1.0.11.exe(官方)

3. 配置mingw+msys环境变量

方法1:配置系统环境变量PATH

我的电脑->属性->高级系统设置->环境变量->系统变量->Path->编辑->变量值
如果是mingw+msys,则把mingw的bin目录,msys的bin目录加入环境变量,用分号隔开

方法2:

接下来便是环境变量的配置,找到 MinGW 的安装目录,进入 C:MinGWmsys1.0 路径,有一个 msys.bat 文件,它就是我们运行 GCC 的 bat 文件,右键发送到桌面快捷方式,方便以后打开,双击打开,完后 输入 gcc,会提醒我们查找不到这个命令。

出现上面情况的原因是没有配置环境变量,进入 C:MinGWmsys1.0etc,有一个 profile 的文件,使用记事本编辑打开,在末尾追加一句:
export PATH=/c/MinGWbin:$PATH

这里的路径就是 MinGW 的安装路径。完后重新打开 msys.bat,输入 gcc,已经成功配置环境变量:
在这里插入图片描述
完后可以创建一个简单的 C 程序测试一下:

4. MinGW 和 Cygwin 的具体区别

在上安装 MinGW 和 Cygwin 时我们运行同一个测试程序,分别生成了 test.exe 和 a.exe 两个可执行程序,那么它们具体有什么区别呢,我们在 Windows 系统自带的控制台中分别来运行它们。
在这里插入图片描述
当我们运行 MinGW 编译生成的 test.exe 时,控制台成功输出了 test mingw,然而当我们运行 Cygwin 编译生成的 a.exe 时,却出现了上图所示的错误,这是什么原因呢?(我也很懵逼0.0)
原来,我们的计算机查找不到 cygwin1.dll 这个库,这个库是 Cygwin 用来模拟 Linux 环境的一个库,它可以把 Linux 的 API 映射带 Windows 下来执行 Windows 程序,如果我们想要执行它,只需要将 Cygwin 的目录添加到环境变量即可。我们将 Cygwin 的目录添加到 PATH 环境变量即可。

作者:Barry_1
链接:https://www.jianshu.com/p/b940cc575e57
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

5. G++命令简介

5.1 编译简单的 C 程序

C 语言经典的入门例子是 Hello World,下面是一示例代码:

#include <stdio.h>
int main(void)
{
printf(“Hello, world!n”);
return 0;
}

我们假定该代码存为文件‘hello.c’。要用 gcc 编译该文件,使用下面的命令:

$ gcc -g -Wall hello.c -o hello

该命令将文件‘hello.c’中的代码编译为机器码并存储在可执行文件 ‘hello’中。机器码的文件名是通过 -o 选项指定的。该选项通常作为命令行中的最后一个参数。如果被省略,输出文件默认为 ‘a.out’。

注意到如果当前目录中与可执行文件重名的文件已经存在,它将被覆盖。

  • 选项 -Wall
    开启编译器几乎所有常用的警告──强烈建议你始终使用该选项。编译器有很多其他的警告选项,但 -Wall 是最常用的。默认情况下GCC 不会产生任何警告信息。当编写 C 或 C++ 程序时编译器警告非常有助于检测程序存在的问题。 注意如果有用到math.h库等非gcc默认调用的标准库,请使用-lm参数

本例中,编译器使用了 -Wall 选项而没产生任何警告,因为示例程序是完全合法的。

  • 选项 “”-g”"
  • 表示在生成的目标文件中带调试信息,调试信息可以在程序异常中止产生core后,帮助分析错误产生的源头,包括产生错误的文件名和行号等非常多有用的信息。

要运行该程序,输入可执行文件的路径如下:

$ ./hello
Hello, world!

这将可执行文件载入内存,并使 CPU 开始执行其包含的指令。 路径 ./ 指代当前目录,因此 ./hello 载入并执行当前目录下的可执行文件 ‘hello’。

  • 捕捉错误
    如上所述,当用 C 或 C++ 编程时,编译器警告是非常重要的助手。为了说明这一点,下面的例子包含一个微妙的错误:为一个整数值错误地指定了一浮点数控制符‘%f’。
#include <stdio.h>
int main (void)
{
	printf (“Two plus two is %fn”, 4);
	return 0;
}

一眼看去该错误并不明显,但是它可被编译器捕捉到,只要启用了警告选项 -Wall。

编译上面的程序‘bad.c’,将得到如下的消息:

$ gcc -Wall -o bad bad.c
main.c: 在函数‘main’中:
main.c:5: 警告: 格式‘%f’需要类型‘double’,但实参 2 的类型为‘int’

这表明文件 ‘bad.c’第 6 行中的格式字符串用法不正确。GCC 的消息总是具有下面的格式 文件名:行号:消息。编译器对错误与警告区别对待,前者将阻止编译,后者表明可能存在的问题但并不阻止程序编译。

本例中,对整数值来说,正确的格式控制符应该是 %d。

如果不启用 -Wall,程序表面看起来编译正常,但是会产生不正确的结果:

$ gcc bad.c -o bad
$ ./bad
Two plus two is 0.000000

显而易见,开发程序时不检查警告是非常危险的。如果有函数使用不当,将可能导致程序崩溃或产生错误的结果。开启编译器警告选项 -Wall 可捕捉 C 编程时的多数常见错误。

编译多个源文件
一个源程序可以分成几个文件。这样便于编辑与理解,尤其是程序非常大的时候。这也使各部分独立编译成为可能。

下面的例子中我们将程序 Hello World 分割成 3 个文件:‘hello.c’,‘hello_fn.c’和头文件‘hello.h’。这是主程序‘hello.c’:

#include “hello.h”
int main(void)
{
	hello (“world”);
	return 0;
}

在先前例子的‘hello.c’中,我们调用的是库函数 printf,本例中我们用一个定义在文件‘hello_fn.c’中的函数 hello 取代它。

主程序中包含有头文件‘hello.h’,该头文件包含函数 hello 的声明。我们不需要在‘hello.c’文件中包含系统头文件‘stdio.h’来声明函数 printf,因为‘hello.c’没有直接调用 printf。

文件‘hello.h’中的声明只用了一行就指定了函数 hello 的原型。

void hello (const char * name);

函数 hello 的定义在文件‘hello_fn.c’中:

#include <stdio.h>
#include “hello.h”

void hello (const char * name)
{
	printf (“Hello, %s!n”, name);
}

语句 #include “FILE.h” 与 #include <FILE.h> 有所不同:前者在搜索系统头文件目录之前将先在当前目录中搜索文件‘FILE.h’,后者只搜索系统头文件而不查看当前目录。

要用gcc编译以上源文件,使用下面的命令:

$ gcc -Wall hello.c hello_fn.c -o newhello

本例中,我们使用选项 -o 为可执行文件指定了一个不同的名字 newhello。注意到头文件‘hello.h’并未在命令行中指定。源文件中的的 #include “hello.h” 指示符使得编译器自动将其包含到合适的位置。

要运行本程序,输入可执行文件的路径名:

$ ./newhello
Hello, world!

源程序各部分被编译为单一的可执行文件,它与我们先前的例子产生的结果相同。

6. Makefile经典教程(一个很棒很清晰的讲解)

2017年04月17日 21:24:21 Seven_Amber 阅读数:22643
该篇文章为转载,是对原作者系列文章的总汇加上标注。

支持原创,请移步陈浩大神博客:(最原始版本)

http://blog.csdn.net/haoel/article/details/2886

转自一个博主 基于原博客的整理版本:

http://blog.csdn.net/ruglcc/article/details/7814546/

我转自:https://blog.csdn.net/Seven_Amber/article/details/70216216

另一种:Win7 64位中MinGW和MSYS的安装

背景:

A. 由于需要在Win7 64位系统下使用Visual Studio,并调用OpenBlas库,所以需要gcc在windows下编译该库。

B. MinGW集成了众多的编译器,因此想通过安装MinGW来使用gcc。同时,需要通过MSYS使用与编译相关的命令行。因此,需要同时安装MinGW和 MSYS。

C. 通常,网上能找到的MinGW安装包中(http://www.mingw.org)都已经附带了MSYS组件,且提供了GUI界面,因此安装较为容易,可参考本人博文 (Windows 中OpenBlas 的安装 - Windows 32bit 适用 )。然而,针对MinGW,这些安装包中的编译器往往只适用于Win32, 而不适用于Win64。

D. 因此,若要在Win7 64位中使用MinGW,就需要特别安装 MinGW-w64。

E. MinGW和MSYS是两个可独立使用的组件。MinGW对操作系统敏感。

安装:

安装前请先务必卸载其他版本的MinGW。

  1. 首先安装MinGW-w64。

========== 安装方法 A ==========

下载地址:http://sourceforge.net/projects/mingw-w64/?source=recommended

而后启动该 .exe文件,开始安装。安装开始时,需要注意设置为如下图所示。安装目录设为 C:MinGW,这个目录是MinGW推荐的。由于是在线下载、安装,所以耗时大概为30分钟。

安装完成后,需要将路径 C:MinGWmingw64bin 添加到PATH环境变量中。此时启动cmd窗口,输入 gcc -v,则可以查看到gcc编译器的版本信息。

备注:

A. 不同于以往的MinGW安装包,该MinGW-w64只包含了MinGW编译器本身,而不包含MSYS等组件,因此在后续并不会弹出Windows 中OpenBlas 的安装 - Windows 32bit 适用 中所示的组件选择安装界面。MinGW-w64只是单纯的编译器安装包,这也是为什么本文中需要单独安装MSYS的原因。

B. 由于后续MSYS可能调用make命令,而MinGW系列只提供了名字为 mingw32-make.exe 的执行文件(C:MinGWmingw64bin 路径下),事实上,该.exe 和make.exe 功能一样,为了make执行时能找到该文件,建议复制 mingw32-make.exe 一份,并将复制文件命名为’make.exe’。

========== 安装方法 B ==========

方法A需要在线下载、安装,因此对网络有要求(我第二次用A方法安装MinGW遇到的问题就是:可以浏览网页并下载mingw-w64-install.exe,但后续的在线安装就出问题: Cannot download repository.txt [0],具体原因没有找到,只怪学校的网络管得太…)。通过如下链接:

http://sourceforge.net/p/mingw-w64/mailman/message/32967954/

直接下载合适配置的、已编译的MinGW64文件库,放到C:MinGW目录下,并同方法A一样进行后续处理。具体下载哪个版本,可以参考方法A中的setting,或者结合自己的需求。

  1. 安装 MSYS。

下载地址: http://sourceforge.net/projects/mingwbuilds/files/external-binary-packages/

在该下载页面中,应该下载的是下图中README.txt下面的压缩包文件,而非‘Download mingw-builds-install.exe’。

下载后,解压缩,可看到文件内有msys文件夹,将msys文件夹整体移动到路径 C:MinGW 下。在msys文件夹内,会看到 msys.bat 文件,双击则启动MSYS,在MSYS中则可使用UNIX下的命令行,如make。

备注:

A. 在MSYS中,可用 ‘where make’ 来查看可供调用的 make.exe 位置。

我的一个小疑惑,如前面所写,MinGW内存在make.exe,而MSYS内也存在make.exe(C:MinGWmsysbin),那么当在MSYS内输入make命令时,调用的到底是那个make.exe? 希望路过的知道答案的能指点一下。

作者:Life_XY
来源:CSDN
原文:https://blog.csdn.net/yangyangyang20092010/article/details/46350519
版权声明:本文为博主原创文章,转载请附上博文链接!

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

生成海报
点赞 0

acktomas

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

ESP8266 无限重启踩坑

最近做了一个电子墨水屏万年历,在移植屏幕代码时遇到了esp8266无限软复位的问题,如果你的串口打印是以下图片所示,那么恭喜你问题解决了。 造成软复位的原因是因为,程序里有死循环&#xf