GCC使用教程.docx
- 文档编号:8677038
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:71
- 大小:70.66KB
GCC使用教程.docx
《GCC使用教程.docx》由会员分享,可在线阅读,更多相关《GCC使用教程.docx(71页珍藏版)》请在冰豆网上搜索。
GCC使用教程
GCC使用教程.
目录
1.gcc
1.makefile写法
2.gcc_egcs使用
3.gdb使用
4.gcc常用选项对代码的影响
1.一般情况
2.-O编译选项
3.-O2编译选项
4.-fomit-frame-pointer编译选项
5.-fomit-frame-pointer&&-O2
6.-fPIC编译选项
7.-static编译选项
5.AT&T的汇编格式
6.x86内联汇编
1.简述
2.内联汇编
3.程序模板
4.操作数
5.修饰寄存器列表
6.操作数约束
7.示例
1.寄存器约束
2.匹配约束
3.内存操作数约束
4.修饰寄存器
7.不同的CPU下最佳编译参数
8.代码维护
1.简单cvs
2.automake
3.diff
4.rcs
5.内核重编译常见故障
6.cvs
7.共享库工具
8.代码优化
9.GNU编码标准
10.书籍
gcc
makefile写法
蓝森林2001年3月22日08:
44
作者:
许明彦
Abstract:
在Unix上写程式的人大概都碰过Makefile,尤其是用C来开发程式的人。
用make来开发和编译程式的确很方便,可是要写出一个Makefile就不简单了。
偏偏介绍Makefile的文件不多,GNUMake那份印出来要几百页的文件,光看完Overview就快阵亡了,难怪许多
人闻Unix色变。
本文将介绍如何利用GNUAutoconf及Automake这两套软体来协助我们『自动』产生Makefile档,并且让开发出来的软体可以像Apache,MySQL和常见的GNU软体一样,只要会``./configure'',``make'',``makeinstall''就可以把程式安装到系统中。
如果您有
心开发OpenSource的软体,或只是想在Unix系统下写写程式。
希望这份介绍文件能帮助您轻松地进入UnixProgramming的殿堂。
1.简介
Makefile基本上就是『目标』(target),『关连』(dependencies)和『动作』三者所组成的一连串规则。
而make就会根据Makefile的规则来决定如何编译(compile)和连结(link)程式。
实际上,make可做的不只是编译和连结程式,例如FreeBSD的portcollect
ion中,Makefile还可以做到自动下载原始程式套件,解压缩(extract),修补(patch),设定,然後编译,安装至系统中。
Makefile基本构造虽然简单,但是妥善运用这些规则就也可以变出许多不同的花招。
却也因此,许多刚开始学习写Makefile时会感到没有规范可循,每个人写出来的Makefile长得都不太一样,不知道从何下手,而且常常会受限於自己的开发环境,只要环境变数不同或路
径改一下,可能Makefile就得跟着修改。
虽然有GNUMakefileConventions(GNUMakefile惯例)订出一些使用GNU程式设计时撰写Makefile的一些标准和规范,但是内容很长而且很复杂,并且经常做些调整,为了减轻程式设计师维护Makefile的负担,因此有了Automake。
程式设计师只需写一些预先定义好的巨集(macro),交给Automake处理後会产生一个可供Autoconf使用的Makefile.in档。
再配合利用Autoconf产生的自动设定档configure即可产生一份符合GNUMakefile惯例的Makeifle了。
2.上路之前
在开始试着用Automake之前,请先确认你的系统已经安装以下的软体:
1.GNUAutomake
2.GNUAutoconf
3.GNUm4
4.perl
5.GNULibtool(如果你需要产生sharedlibrary)
我会建议你最好也使用GNUC/C++编译器、GNUMake以及其它GNU的工具程式来做为开发的环境,这些工具都是属於OpenSourceSoftware不仅免费而且功能强大。
如果你是使用RedHatLinux可以找到所有上述软体的rpm档,FreeBSD也有现成的package可以直
接安装,或着你也可以自行下载这些软体的原始档回来DIY。
以下的范例是在RedHatLinux5.2+CLE2的环境下所完成的。
3.一个简单的例子
Automake所产生的Makefile除了可以做到程式的编译和连结,也已经把如何产生程式文件(如manualpage,info档及dvi档)的动作,还有把原始程式包装起来以供散 的动作都考虑进去了,所以原始程式所存放的目录架构最好符合GNU的标准惯例,接下来我拿hello.c来做为例子。
在工作目录下建立一个新的子目录``devel'',再在devel下建立一个``hello''的子目录,这个目录将作为我们存放hello这个程式及其相关档案的地方:
%mkdirdevel
%cddevel
%mkdirhello
%cdhello
用编辑器写个hello.c档,
#includestdio.h
intmain(intargc,char**argv)
{
printf(``Hello,GNU!
'');
return0;
}
接下来就要用Autoconf及Automake来帮我们产生Makefile档了,
1.用autoscan产生一个configure.in的雏型,执行autoscan後会产生一个configure.scan的档案,我们可以用它做为configure.in档的蓝本。
%autoscan
%ls
configure.scanhello.c
2.编辑configure.scan档,如下所示,并且把它的档名改成configure.in
dnlProcessthisfilewithautoconftoproduceaconfigurescript.
AC_INIT(hello.c)
AM_INIT_AUTOMAKE(hello,1.0)
dnlChecksforprograms.
AC_PROG_CC
dnlChecksforlibraries.
dnlChecksforheaderfiles.
dnlChecksfortypedefs,structures,andcompilercharacteristics.
dnlChecksforlibraryfunctions.
AC_OUTPUT(Makefile)
3.执行aclocal和autoconf,分别会产生aclocal.m4及configure两个档案
%aclocal
%autoconf
%ls
aclocal.m4configureconfigure.inhello.c
4.编辑Makefile.am档,内容如下
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=hello.c
5.执行automake--add-missing,Automake会根据Makefile.am档产生一些档案,包含最重要的Makefile.in
%automake--add-missing
automake:
configure.in:
installing`./install-sh'
automake:
configure.in:
installing`./mkinstalldirs'
automake:
configure.in:
installing`./missing'
6.最後执行./configure,
%./configure
creatingcache./config.cache
checkingforaBSDcompatibleinstall.../usr/bin/install-c
checkingwhetherbuildenvironmentissane...yes
checkingwhethermakesets${MAKE}...yes
checkingforworkingaclocal...found
checkingforworkingautoconf...found
checkingforworkingautomake...found
checkingforworkingautoheader...found
checkingforworkingmakeinfo...found
checkingforgcc...gcc
checkingwhethertheCcompiler(gcc)works...yes
checkingwhethertheCcompiler(gcc)isacross-compiler...no
checkingwhetherweareusingGNUC...yes
checkingwhethergccaccepts-g...yes
updatingcache./config.cache
creating./config.status
creatingMakefile
现在你的目录下已经产生了一个Makefile档,下个``make''指令就可以开始编译hello.c成执行档,执行./hello和GNU打声招呼吧!
%make
gcc-DPACKAGE="hello"-DVERSION="1.0"-I.-I.-g-O2-chello.c
gcc-g-O2-ohellohello.o
%./hello
Hello!
GNU!
你还可以试试``makeclean'',''makeinstall'',''makedist''看看会有什麽结果。
你也可以把产生出来的Makefile秀给你的老板,让他从此对你刮目相看:
-)
4.一探究竟
上述产生Makefile的过程和以往自行编写的方式非常不一样,舍弃传统自行定义make的规则,使用Automake只需用到一些已经定义好的巨集即可。
我们把巨集及目标(target)写在Makefile.am档内,Automake读入Makefile.am档後会把这一串已经定义好的巨集展
开并且产生对应的Makefile.in档,然後再由configure这个shellscript根据Makefile.in产生适合的Makefile。
在此范例中可藉由Autoconf及Automake工具所产生的档案有configure.scan、aclocal.m4、configure、Makefile.in,需要我们加入设定者为configure.in及Makefile.am。
4.1编辑configure.in档
Autoconf是用来产生'configure'档的工具。
'configure'是一个shellscript,它可以自动设定原始程式以符合各种不同平台上Unix系统的特性,并且根据系统叁数及环境产生合适的Makefile档或是C的标头档(headerfile),让原始程式可以很方便地在这些不同
的平台上被编译出来。
Autoconf会读取configure.in档然後产生'configure'这个shellscript。
configure.in档的内容是一连串GNUm4的巨集,这些巨集经过autoconf处理後会变成检查系统特徵的shellscript。
configure.in内巨集的顺序并没有特别的规定,但是每一个configure.in档必须在所有巨集前加入AC_INIT巨集,然後在所有巨集的最後面加上AC
_OUTPUT巨集。
我们可先用autoscan扫描原始档以产生一个configure.scan档,再对configure.scan做些修改成configure.in档。
在范例中所用到的巨集如下:
dnl
这个巨集後面的字不会被处理,可视为注解。
AC_INIT(FILE)
这个巨集用来检查原始码所在的路径,autoscan会自动产生,我们不必修改它。
AM_INIT_AUTOMAKE(PACKAGE,VERSION)
这是使用Automake所必备的巨集,PACKAGE是我们所要产生软体套件的名称,VERSION是版本编号。
AC_PROG_CC
检查系统可用的C编译器,如果原始程式是用C写的就需要这个巨集。
AC_OUTPUT(FILE)
设定configure所要产生的档案,如果是Makefile的话,configure便会把它检查出来的结果带入Makefile.in档然後产生
合适的Makefile。
实际上,我们使用Automake时,还须要一些其它的巨集,这些额外的巨集我们用aclocal来帮我们产生。
执行aclocal会产生aclocal.m4档,如果没有特别的用途,我们可以不必修改它,用aclocal所产生的巨集会告诉Automake怎麽做。
有了configure.in及aclocal.m4两个档案後,便可以执行autoconf来产生configure档了。
4.2编辑Makefile.am档
接下来我们要编辑Makefile.am档,Automake会根据configure.in中的巨集把Makefile.am转成Makefile.in档。
Makefile.am档定义我们所要产的目标:
AUTOMAKE_OPTIONS
设定automake的选项。
Automake主要是帮助开发GNU软体的人员维护软体套件,所以在执行automake时,会检查目录下是否存在标准GNU软体套件中应具备的文件档案,例如'NEWS'、'AUTHOR'、'ChangeLog'等文件档。
设成foreign时,automake会改用一般软
体套件的标准来检查。
bin_PROGRAMS
定义我们所要产生的执行档档名。
如果要产生多个执行档,每个档名用空白字元隔开。
hello_SOURCES
定义'hello'这个执行档所需要的原始档。
如果'hello'这个程式是由多个原始档所产生,必须把它所用到的原始档都列出来,以空白字元隔开。
假设'hello'这个程式需要'hello.c'、'main.c'、
'hello.h'
三个档案的话,则定义
hello_SOURCES=hello.cmain.chello.h
如果我们定义多个执行档,则对每个执行档都要定义相对的filename_SOURCES。
编辑好Makefile.am档,就可以用automake--add-missing来产生Makefile.in。
加上--add-missing选项是告诉automake顺便帮我们加入包装一个软体套件所必备的档案。
Automake产生出来的Makefile.in档是完全符合GNUMakefile的惯例,我们只要执行confi
gure这个shellscript便可以产生合适的Makefile档了。
4.3使用Makefile
利用configure所产生的Makefile档有几个预设的目标可供使用,我们只拿其中几个简述如下:
makeall
产生我们设定的目标,即此范例中的执行档。
只打make也可以,此时会开始编译原始码,然後连结,并且产生执行档。
makeclean
清除之前所编译的执行档及目的档(objectfile,*.o)。
makedistclean
除了清除执行档和目的档外,也把configure所产生的Makefile也清除掉。
makeinstall
将程式安装至系统中。
如果原始码编译无误,且执行结果正确,便可以把程式安装至系统预设的执行档存放路径。
如果我们用bin_PROGRAMS巨集的话,程式会被安装至/usr/local/bin这个目录。
makedist
将程式和相关的档案包装成一个压缩档以供散播(distribution)。
执行完在目录下会产生一个以PACKAGE-VERSION.tar.gz为名称的档案。
PACKAGE和VERSION这两个变数是根据configure.in档中AM_INIT_AUTOMAKE(PACKAGE,VERSION)的定义。
在此范例中会产生
'hello-1.0.tar.gz'的档案。
makedistcheck
和makedist类似,但是加入检查包装後的压缩档是否正常。
这个目标除了把程式和相关档案包装成tar.gz档外,还会自动把这个压
缩档解开,执行configure,并且进行makeall的动作,确认编译无误後,会显示这个tar.gz档已经准备好可供散播了。
这个检查非
常有用,检查过关的套件,基本上可以给任何一个具备GNU发展境的人去重新编译。
就hello-1.tar.gz这个范例而言,除了在Red
HatLinux上,在FreeBSD2.2.x版也可以正确地重新编译。
要注意的是,利用Autoconf及Automake所产生出来的软体套件是可以在没有安装Autoconf及Automake的环境上使用的,因为configure是一个shellscript,它己被设计可以在一般Unix的sh这个shell下执行。
但是如果要修改configure.in及Makefile.a
m档再产生新的configure及Makefile.in档时就一定要有Autoconf及Automake了。
5.相关讯息
Autoconf和Automake功能十分强大,你可以从它们所附的info档找到详细的用法。
你也可以从许多现存的GNU软体或OpenSource软体中找到相关的configure.in或Makefile.am档,它们是学习Autoconf及Automake更多技巧的最佳范例。
这篇简介只用到了Autoconf及Automake的皮毛罢了,如果你有心加入OpenSource软体开发的行列,希望这篇文件能帮助你对产生Makefile有个简单的依据。
其它有关开发GNU程式或C程式设计及Makefile的详细运用及技巧,我建议你从GNUCodingStandards3
(GNU编码标准规定)读起,里面包含了GNUMakefile惯例,还有发展GNU软体套件的标准程序和惯例。
这些GNU软体的线上说明文件可以在http:
//www.gnu.org/这个网站上找到。
6.结语
经由Autoconf及Automake的辅助,产生一个Makefile似乎不再像以前那麽困难了,而使用Autoconf也使得我们在不同平台上或各家Unix之间散播及编译程式变得简单,这对於在Unix系统上开发程式的人员来说减轻了许多负担。
妥善运用这些GNU的工具软体,可
以帮助我们更容易去发展程式,而且更容易维护原始程式码。
一九九八年是OpenSource运动风起云涌的一年,许多OpenSource的软体普遍受到网路上大众的欢迎和使用。
感谢所有为OpenSource奉献的人们,也希望藉由本文能吸引更多的人加入『自由』、『开放』的OpenSource行列。
Aboutthisdocument...
轻轻松松产生Makefile1
ThisdocumentwasgeneratedusingtheLaTeX2HTMLtranslatorVersion98.2beta6(August14th,1998)Copyright(C)1993,1994,1995,1996,NikosDrakos,ComputerBasedLearningUnit,UniversityofLeeds.Copyright(C)1997,1998,RossMoore,MathematicsDepartment,MacquarieUniversity,Sydney.
Thecommandlineargumentswere:
latex2html-split0-show_section_numbersautomake.tex
Thetranslationwasinitiatedbyon1999-02-11
Footnotes
...itle1
本文件使用ChiLaTeX制作。
...CLE2
CLE(ChineseLinuxExtension,Linux中文延伸套件),
http:
//cle.linux.org.tw/
...Standards3
GNUCodingStandards,RichardStallman.
gcc_egcs使用
1.使用egcs
Linux中最重要的软件开发工具是GCC。
GCC是GNU的C和C++编译器。
实际上,GCC能够编译三种语言:
C、C++和ObjectC(C语言的一种面向对象扩展)。
利用gcc命令可同时编译并连接C和C++源程序。
#DEMO#:
hello.c
如果你有两个或少数几个C源文件,也可以方便地利用GCC编译、连接并生成可执行文件。
例如,假设你有两个源文件main.c和factorial.c两个源文件,现在要编译生成一个计算阶乘的程序。
-----------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GCC 使用 教程