在windows下使用GNU工具-gcc编译器
2021-02-20 20:20
2018-01-12 19:10:42
在windows下使用GNU编译器-gcc编译器
1、MinGW(Minimalist GNU on Windows)编译工具介绍
MinGW是指只用自由软件来生成纯粹的Win32可执行文件的编译环境,它是Minimalist(简化) GNU on Windows的略称。
unix-like系统上的gcc的windows移植版本:MinGW编译系统/工具
实际上 MinGW 并不是一个 单纯的C/C++ 编译器,而是一套 GNU 工具集合。除开 GCC 以外,MinGW 还包含有一些其他的 GNU 程序开发工具 (比如 gawk bison 等等)。开发 MinGW 是为了那些不喜欢工作在 Linux(FreeBSD) 操作系统而留在 Windows 的人提供一套符合 GNU 的 GNU 工作环境。所以,使用 MinGW 我们就可以像在 Linux 下一样使用 GNU 程序开发工具。
GCC 就是 MinGW 的核心所在,GCC 是一套支持众多计算机程序语言的编译系统,而且在语言标准的实现上是最接近于标准的。并且 GCC 几乎可以移植到目前所有可用的计算机平台。(我的电脑上就还装有 DevKitPro,里面包含 GCC 的 ARM(for GBA/DS/GP32) 和 MIPS(for PSP) 版本。)
GCC 本身不像 VC 那样拥有IDE 界面(在 Windows 上也存在 Dev C++ 之类的支持 MinGW 编译器的 IDE)。源代码编辑你可以选用任何你喜欢的文本编辑器(据说微软的开发人员包括 VC 的开发都不用 VC 所带的 IDE 编辑器,而是选用 GNU 的 VIM 编辑器)。然后使用 make 等工具来进行软件项目的编译、链接、打包乃至发布。而像 cvs(svn) 源代码版本控制工具可以让世界上任何一个角落的人都可以参与到软件项目中来。
文本编辑器产生源文件+gcc编译系统编译(产生可执行文件??)
2、MinGW主要文件
gcc-core C语言编译器
gcc-c++ C++语言编译器
mingw-runtime MinGW的运行时库(这个必须安装)
win32api win32的API函数头文件和连接库
binutils MinGW的汇编器和连接器等基础工具
gdb MinGW中的调试工具
mingw32-make Make工具,用以更好的管理你的项目
3、gcc常见命令
gcc -v //查看gcc的版本信息 gcc -o test test.c //执行test.c,产生文件命名为test,若省略则默认为a gcc -E //预处理 //-g 可执行程序包含调试信息 // -o output_filename,确定输出文件的名称为output_filename //-c 只编译不链接 //-c 产生.o文件,就是obj文件,不产生执行文件
$:表示程序所在目录,比如:F:\MinGW>
3. 1、执行如下命令:
$ gcc -o hello hello.c
运行如下 : $ hello
输出: Hello,world!
3.2、我们也可以分步编译如下:
分步暂时省略,太懒了,看上面的代码
3.3、我们可以把几个文件一同编译生成同一个可执行文件。
比如:一个工程有main.c、 foo.c 、def.c生成foo的可执行文件。
编译命令如下:
$ gcc –c main.c foo.c def.c –o foo //或者: $ gcc –o foo main.c foo.c def.c
4、库依赖(库依赖windows下应该是和linux下一样的)
函数库是一些头文件(.h)和库文件(.so或者.a)的集合。Linux下的大多数函数都默认将头文件放到/usr/include/目录下,而库文件则放到/usr/lib/目录下,但并非绝对如此。因此GCC设有添加头文件和库文件的编译选项开关。
1. 添加头文件:-I
例如在/home/work/include/目录下有编译foo.c所需头文件def.h,为了让GCC能找到它们,就需要使用-I选项:
$ gcc foo.c -I /home/work/include/def.h -o foo
2. 添加库文件:-L
例如在/home/work/lib/目录下有链接所需库文件libdef.so,为了让GCC能找到它们,就需要使用-L选项:
$ gcc foo.c –L /home/work/lib –ldef.a –o foo
说明:-l选项指示GCC去连接库文件libdef.so。Linux下的库文件命名有一个约定,即库文件以lib三个字母开头,因为所有的库文件都遵循这个约定,故在用-l选项指定链接的库文件名时可以省去lib三个字母。
[题外语]
Linux下的库文件分为动态链接库(.so文件)和静态链接库(.a文件)。GCC默认为动态库优先,若想在动态库和静态库同时存在的时候链接静态库需要指明为-static选项。比如上例中如还有一个libdef.a而你想链接libdef.a时候命令如下:
$ gcc foo.c –L /home/work/lib –static –ldef.a –o foo
5、代码优化
GCC提供不同程度的代码优化功能。开关选项是:-On,n取值为0到3。默认为1。-O0表示没有优化,而-O3是最高优化。优化级别越高代码运行越快,但并不是所有代码都能够加载最高优化,而应该视具体情况而定。但一般都使用-O2选项,因为它在优化长度、编译时间和代码大小之间,取得了一个比较理想的平衡点。
以下这段是我摘自别人文章的,说的比较详细:
编译时使用选项-O可以告诉GCC同时减小代码的长度和执行时间,其效果等价于-O1。在这一级别上能够进行的优化类型虽然取决于目标处理器,但一般都会包括线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化。选项-O2告诉GCC除了完成所有-O1级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。选项-O3则除了完成所有-O2级别的优化之外,还包括循环展开和其它一些与处理器特性相关的优化工作。通常来说,数字越大优化的等级越高,同时也就意味着程序的运行速度越快。
下面通过具体实例来感受一下GCC的代码优化功能,所用程序如清单3所示。
6、15个常用的gcc命令
http://blog.csdn.net/typename/article/details/8170213
文章标题:在windows下使用GNU工具-gcc编译器
文章链接:http://soscw.com/index.php/essay/58140.html