现在的位置: 首页 > 综合 > 正文

GCC for Win32 开发环境介绍(4)

2018年05月27日 ⁄ 综合 ⁄ 共 4283字 ⁄ 字号 评论关闭

上文回顾:

在上一篇文章中,我主要为大家介绍了有关IDE方面的内容。其中主要包括一些我个人比较喜欢的三个IDE。本文,我将为各位介绍GCC的编译参数以及组成和Makefile的使用方式。

GCC for Win32 开发环境介绍(4)

第三章 GCC粗探——GCC的组成与附加参数

第一节 GCC的家族成员

总的来说,GCC应该是一个编译器。可是,为什么我还要在这里介绍GCC的家族成员呢?其实,整套的GCC环境并不是由GCC构成的,他是由多个包所组成的。这些包的互相作用产生了GCC的开发环境。其中,有一些包是你开发应用程序所必备的基本包。离开这些包你将无法正常使用GCC

GCC的基本包列表。

GCC的基本开发环境,主要由一下几个包构成。Binutils,这个是辅助GCC的工具包,里面包含了连接器,汇编器,动态静态库生成程序,等等。GCC,这个包是GCC本身。当然GCC包中还包括一下几个包,如core,java,ada等,每个包都代表了一种语言。然后,就是win32api,mingw-runtime,这个是在Win32下使用的标准函数包。如果,你使用的是Cygwin或者是在Unix环境下,那么这个包就是GlibC

所以,由上所述。GCC的基本包有:binutils gcc glibc/[win32api,mingw-runtime]有了这些包。你基本能够开始编译应用程序了。

当然,如果说你想要写一个小程序。自然这些包已经够了。但是如果你要写一个较大的工程。那么,这些包也许就不能很好的胜任你的工作了。因为,对于一个大的项目,需要编译的文件不只一个,而且还有依赖关系等等。

所以,GCC中还包括gmake包用于管理项目。当然,还有automake。但是我个人还是不太喜欢automakeautomake其实是帮助你自动的管理你的项目,当然实现这个自动也是比较麻烦的,所以与其用automake管理中小型项目,不如用gmake自己写个脚本。不过,automake通常用于源代码发布的应用,如果在开发时使用会延长开发周期。

Gmake,automake,都是通过编译脚本来批量的编译程序。他们能够更具你所给定的依赖关系,来自动的判断需要重新编译的源代码,然后编译。这点的确可以帮助开发人员减轻不少的人力和开发周期。比如,你用Makefile管理一个项目,那么在你第一次编译程序以后,如果你的源代码没有做过任何编辑,那么下次再调用gmake的程序时,gmake就不会再去一一编译每个文件。而是简单的连接一下主程序,或者什么都不作的退出(这要取决于你写的Makefile脚本)

但是,对于有些开发人员来说,上面这些包还是不能满足他们的要求。因为他们要调试程序。所以,GCC还包括另一个包。那就是GDBgdbGCC开发的,用于跟踪调试的,命令符型调试器。它的功能还是比较强大的。基本,你能在VC下做到的,GDB也可以。不过,GDB的命令还是比较多的。掌握一些基本的调试命令一般就够使用了。

总结

GCC开发环境包括如下几大包。

binary

基本包

提供基本的汇编器,连接器等

gcc

基本包

各种语言的编译器,包括C,C++,Ada,Java

Win32api,mingwi-runtime/glibc

基本包

系统函数库

Gmake/automake

需要包

管理项目编译的程序

gdb

附加包

调试程序

第二节 GCC的常用编译参数

VC,TC等编译器不同,GCC其实是可以很方便的在提示符下编译程序的。GCC在提示符下编译程序,并没有如同VC那样的冗长而晦涩的编译参数。相反,却有着比VC更灵活且简短的参数。

不得不承认,不懂GCC编译参数的人,确实会损失一些GCC的强大功能。所以,我下面简单介绍一下GCC的一些基本编译参数。这里,我以C编译器为例。

编译二进制代码

$gcc -c yours.c -o yours.o

使用这段指令,GCC将会把yours.c编译成yours.o的二进制代码。其中,yours.o就类似于VC,TC中的.obj文档。

编译最简单的小程序。

$gcc -o yours yours.c

通过这条指令,GCC将会把yours.c源代码编译成名为yours的可执行程序。当然,您也可以将yours.c改成我们刚才介绍的yours.o文件。这样,gcc将使用编译刚才编译好的二进制文档来链接程序。这里,格式的特点是,-o 后面是一串文件列表,第一个参数是所编译程序的文件名,从第二个开始,就是您编译和连接该可执行程序所需要的二进制文档或者源代码。

编译时将自己的头文件目录设为默认头文件目录

$gcc -I”Your_Include_Files_Document_Path” -c yours.c -o yours.o

这条指令中的-I参数将会把Your_Include_Files_Document_Path添加到你默认的头文件目录中。这样您将可以使用 #include <your_include.h>来导入头文件。

编译时使用自己的静态库存放目录

$gcc -L”Your_Lib_Files_Document_Path” -o yours yours.o

这条指令将会让GCC在连接时除了在默认Lib存放目录中搜索指定的静态库以外,还会在Your_Lib_Files_Document_Path中搜索。

编译时使用静态连接库

$gcc -lyour_lib -o yours yours.o

这条指令将会让GCC在连接时把 libyour_lib.a中您所用到的函数连接到可执行程序中。此处注意,GCC所使用的静态连接库是lib*.a格式的。在连接时,只且仅需要提供*的内容就可以了。

编译时使用优化

$gcc -O2 -c yours.c -o yours.o

使用优化方式编译程序,其中除了-O2以外,还有-O3 -O1等等。他们代表不同的优化等级。最常用的,是-O2优化。当然,还有针对特殊CPU的优化,这里就不介绍了。

编译时显示所有错误和警告信息

$gcc -Wall -c yours.c -o yours.o

GCC在默认情况下,将对一些如变量申请未使用这样的问题或者申请了没有给予初始值的问题忽略。但是,如果使用了-Wall参数,编辑器将列出所有的警告信息。这样,您就可以知道您的代码中有多少可能会在其他操作系统下出错的地方了。(用这个指令看看你的代码有多少地方写的不怎么合适。)

编译连接时,加入调试代码

$gcc -g -o yours yours.c

正如同VCdebug编译模式一样,GCC也有debug模式。添加了-g 参数编译的可执行程序比普通程序略为大一些,其中添加了一些调试代码。这些代码将被gdb所支持。

连接时缩小代码体积

$gcc -s -o yours yours.o

这个参数,似乎我没有在Unix环境下看到过。也不知道具体什么作用。因为有人说Visual-MinGW生成的代码小,于是研究了一下她的编译参数,发现release模式的编译参数就加了这一项。貌似编译后的代码的确缩小了很多。

获得帮助

$gcc --help

这条指令从意思上就能看出,获得gcc的帮助信息。如果您有什么特殊需要,也许这个指令能帮上点小忙。

第三节 如何写一个简单的Makefile

说了半天Makefile管理项目,我想现在该说一下如何写了。其实,Makefile文件总体还是比较容易写的,基本只要你会使用命令行,就可以写Makefile。下面我简单介绍一下Makefile的构成和书写。

一个输出 HelloWorld 的简单Makefile

all:

echo HelloWorld

这个Makefile代码,运行后将在屏幕上打印一个HelloWorldall其实是类似C代码中的main函数。gmake程序将在运行Makefile代码时,首先运行此处的代码。注意,此处echo前面的是<tab>GCC对空格很敏感的。

添加依赖项的Makefile

all:depend

@echo I am the main

depend:closeecho

@echo I am the depend

closeecho:

@echo off

这个Makefile代码,的作用还是输出句子。不同的是她添加了几个指令块之间的依赖关系。其中all依赖于dependdepend依赖于closeecho。这样,程序在编译时将根据脚本的依赖关系来判断文件编译的先后顺序。

执行Makefile

$make -f Makefile

通常情况下,不用-f参数,make程序将在当前目录下搜索名为Makefile的文件作为需要执行的文件。而使用-f将指定Makefile的文件名。

一个完整的Makefile

all:yours

@echo OK

yours:yours.o

gcc -o yours yours.o

yours.o:yours.c

gcc -c yours.c -o yours.o

更多有关Makefile的详细内容请查相关资料。

文外音:

的确,发现了。我这个系列的文章进展的并没有我预期和承诺的那么快。确实挺让我感到无奈的。不过,幸好你能够理解我。总体来说,本文主要是简单介绍一下GCC的一些基础。因为我发现有许多读者对GCC并不是很了解。

说来也挺无奈的,最近发现原来周围有个小人当道。此人姓名我也就隐去了。从去年开始,就常常在和我聊得比较好的几个女生面前造我的谣。所以,原本应该9月该出来的文章拖延到了9月底。说起这个人,我希望大家要以此人为鉴。不要像他那样。

这人自称在硬件方面很行,不过据我所知,他无非就是可以把各种型号的主板和硬件编号背出来而已。连基本的线程进程都搞不清楚。还成天鼓吹32bit的机器是淘汰的机器。不得不承认,这位满口脏话为人无耻的家伙的确硬件方面挺不错的。但是,我还是觉得做技术的人不要太追求表面的东西,不要追求过于超前的东西,同时也更要注意自己的品行道德。

也许是年纪大了,发了一些牢骚。希望各位不要建议。不过,事以至次,我也无力挽回了。

最后感谢各位对我的支持,更感谢那些愿意为我效力的朋友们。同时,如果您有什么问题或者建议,都可以提出来。为了您能及时准确的得到回复请到http://blog.csdn.net/visioncat上发表你的留言。谢谢

STUDIO软件开发组(SDT)

STUDIO Development Team

北斗星君(黄庠魁)

索引:

GCC,Windows,编译参数,Makefile,使用,结构

 

本文转自

北斗星君的专栏 - CSDNBlog
http://blog.csdn.net/VisionCat/archive/2006/06/30/856499.aspx

抱歉!评论已关闭.