ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:31.26KB ,
资源ID:10849162      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10849162.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(GCC基本用法.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

GCC基本用法.docx

1、GCC基本用法linux下c编程起步一:掌握gcc基本用法 初学时最好从命令行入手,这样可以熟悉从编写程序、编译、调试和执行的整个过程。编写程序可以用vi或其它编辑器编写。编译则使用gcc命令。要往下学习首先就得熟悉gcc命令的用法。gcc命令提供了非常多的命令选项,但并不是所有都要熟悉,初学时掌握几个常用的就可以了,到后面再慢慢学习其它选项,免得因选项太多而打击了学习的信心。一. 常用编译命令选项 假设源程序文件名为test.c。1. 无选项编译链接用法:#gcc test.c作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。2. 选项 -

2、o用法:#gcc test.c -o test作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。3. 选项 -E用法:#gcc -E test.c -o test.i作用:将test.c预处理输出test.i文件。4. 选项 -S用法:#gcc -S test.i 作用:将预处理输出文件test.i汇编成test.s文件。5. 选项 -c用法:#gcc -c test.s作用:将汇编输出文件test.s编译输出test.o文件。6. 无选项链接用法:#gcc test.o -o test作用:将编译输出文件test.o链接成最终可执行文件te

3、st。7. 选项-O用法:#gcc -O1 test.c -o test作用:使用编译优化级别1编译程序。级别为13,级别越大优化效果越好,但编译时间越长。二. 多源文件的编译方法如果有多个源文件,基本上有两种编译方法:假设有两个源文件为test.c和testfun.c1. 多个文件一起编译用法:#gcc testfun.c test.c -o test作用:将testfun.c和test.c分别编译后链接成test可执行文件。2. 分别编译各个源文件,之后对编译后输出的目标文件链接。用法:#gcc -c testfun.c /将testfun.c编译成testfun.o#gcc -c tes

4、t.c /将test.c编译成test.o#gcc -o testfun.o test.o -o test /将testfun.o和test.o链接成test以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。 gcc编程环境基础5编译时头文件和库文件路径指定 预处理(preprocessing),编译(compilation),汇编(assembly)和连接(linking)include的header文件,连结数据库,系统定义,总共有下列来源指定gcc去那找.当初在编译时指定的(在gcc/gcc/collect2.c:l

5、ocatelib() 写在specs内的 后来用-D -I -L指定的 gcc环境变量设定(编译的时候) ld.so的环境变量(这是run time的时候) 11.头文件gcc 在编译时怎么去寻找所需要的头文件 :所以header file的搜寻会从-I开始然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH 再找内定目录 /usr/include/usr/local/include/usr/lib/gcc-lib/i386-linux/2.95.2/include/usr/lib/gcc-lib/i386-linux/

6、2.95.2/././././include/g+-3/usr/lib/gcc-lib/i386-linux/2.95.2/././././i386-linux/include库文件不过如果装gcc的时候,是有给定的prefix的话,那么就是 /usr/includeprefix/includeprefix/xxx-xxx-xxx-gnulibc/includeprefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include2.库文件cos()等函式库的选项要多加 -lm 编译的时候:gcc会去找-L再找gcc的环境变量LIBRARY_PATH再找内定

7、目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程式内的 22.利用Linux系统上已有的研发库(1).查看库文件提供了哪些调用能用nm命令自己查看库文件提供了哪些调用(2).通过头文件查看函数的定义 33.gcc选项总体选项 (Overall Option) :(-c(生成目标但不连接) -S(汇编) -E(预处理) -o file(生成指定的文件) -pipe -v(显示过程) -x language (设定文件所使用的语言,使后缀名无效c, 可用参数objective-c, c-header, c+, cpp-output, assem

8、bler, and assembler-with-cpp)语言选项 (LANGUAGE OPTIONS) :(-ansi 只支持 ANSI 标准的 C 语法.这一选项将禁止 GNU C 的某些特色)预处理器选项 (Preprocessor Option) :(-Aassertion -C -dD -dM -dN -Dmacro=defn -E -H -idirafter dir -include file -imacros file -iprefix file -iwithprefix dir -M -MD -MM -MMD -nostdinc -P -Umacro 相当于C语言中的#unde

9、f macro -undef -DMACRO 以字符串“1”定义 MACRO 宏, -DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏)汇编器选项 (ASSEMBLER OPTION) :(-Wa,option )连接器选项 (LINKER OPTION) :(-llibrary -nostartfiles -nostdlib -static -shared -symbolic -Xlinker option -Wl,option -u symbol )目录选项 (DIRECTORY OPTION) :(-Bprefix -Idir -I- -Ldir) 警告选项 (WARNI

10、NG OPTION) :(-w 不生成所有警告信息,-Wall 生成所有警告信息)调试选项 (DEBUGGING OPTION) :(-a -dletters -fpretend-float -g -glevel -gcoff -gxcoff -gxcoff+ -gdwarf -gdwarf+ -gstabs -gstabs+ -ggdb -p -pg -save-temps -print-file-name=library -print-libgcc-file-name -print-prog-name=program )优化选项 (OPTIMIZATION OPTION) :(-O0不进行

11、优化处理,-O或-O1优化生成代码 -O2进一步优化 -O3比-O2更进一步优化,包括inline函数)目标机选项 (TARGET OPTION) :(-b machine -V version )机器相关选项 (MACHINE DEPENDENT OPTION):(-m486 针对 486 进行代码优化)代码生成选项 (CODE GENERATION OPTION) :(-fpic -fPIC)1、用于linux系统下编程的编译器概述GCC(GNU Compiler Collection,GNU编译器套装),是一套由 GNU 开发的编程语言编译器。它是一套 GNU编译器套装以 GPL 及 L

12、GPL 许可证所发行的自由软件,也是 GNU计划的关键部分,亦是自由的类Unix及苹果电脑 Mac OS X 操作系统的标准编译器。 GCC 原名为 GNU C 语言编译器,因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C+。之后也变得可处理 Fortran、Pascal、Objective-C、Java, 以及 Ada与其他语言。 历史GCC是由理查德马修斯托曼在1985年开始的。他首先扩增一个旧有的编译器,使它能编译C,这个编译器一开始是以Pastel语言所写的。Pastel是一个不可移植的Pascal语言特殊版,这个编译器也只能编译Pastel语言。为了让自由软件有一个编译

13、器,后来此编译器由斯托曼和Len Tower在1987年以C语言重写并成为GNU专案的编译器。GCC的建立者由自由软件基金会直接管理。 在1997年,一群不满GCC缓慢且封闭的创作环境者,组织了一个名为EGCSExperimental/Enhanced GNU Compiler System的专案,此专案汇整了数项实验性的分支进入某个GCC专案的分支中。EGCS比起GCC的建构环境更有活力,且EGCS最终也在1999年四月成为GCC的官方版本。 GCC目前由世界各地不同的数个程序设计师小组维护。它是移植到中央处理器架构以及操作系统最多的编译器。 由于GCC已成为GNU系统的官方编译器(包括GN

14、U/Linux家族),它也成为编译与建立其他操作系统的主要编译器,包括BSD家族、Mac OS X、NeXTSTEP与BeOS。 GCC通常是跨平台软件的编译器首选。有别于一般局限于特定系统与执行环境的编译器,GCC在所有平台上都使用同一个前端处理程序,产生一样的中介码,因此此中介码在各个其他平台上使用GCC编译,有很大的机会可得到正确无误的输出程序。 结构GCC的外部接口长得像一个标准的Unix编译器。使用者在命令列下键入gcc之程序名,以及一些命令参数,以便决定每个输入档案使用的个别语言编译器,并为输出程序码使用适合此硬件平台的组合语言编译器,并且选择性地执行连结器以制造可执行的程序。 每

15、个语言编译器都是独立程序,此程序可处理输入的原始码,并输出组合语言码。全部的语言编译器都拥有共通的中介架构:一个前端解析符合此语言的原始码,并产生一抽象语法树,以及一翻译此语法树成为GCC的暂存器转换语言RTL的后端。编译器最佳化与静态程序码解析技术(例如FORTIFY_SOURCE,一个试图发现缓冲区溢位buffer overflow的编译器)在此阶段应用于程序码上。最后,适用于此硬件架构的组合语言程序码以Jack Davidson与Chris Fraser发明的算法产出。 几乎全部的GCC都由C写成,除了Ada前端大部分以Ada写成。 前端接口 前端的功能在于产生一个可让后端处理之语法树。

16、此语法解析器是手写之递回语法解析器。 直到最近,程序的语法树结构尚无法与欲产出的处理器架构脱钩。而语法树的规则有时在不同的语言前端也不一样,有些前端会提供它们特别的语法树规则。 在2005年,两种与语言脱钩的新型态语法树纳入GCC中。它们称为GENERIC与GIMPLE。语法解析变成产生与语言相关的暂时语法树,再将它们转成GENERIC。之后再使用gimplifier技术降低GENERIC的复杂结构,成为一较简单的静态唯一形式(Static Single Assignment form,SSA)基础的GIMPLE形式。此形式是一个与语言和处理器架构脱钩的全域最佳化通用语言,适用于大多数的现代编

17、程语言。 中介接口 一般编译器作者会将语法树的最佳化放在前端,但其实此步骤并不看语言的种类而有不同,且不需要用到语法解析器。因此GCC作者们将此步骤归入通称为中介阶段的部分里。此类的最佳化包括消解死码、消解重复运算与全域数值重编码等。许多最佳化技巧也正在实作中。 后端接口 GCC后端的行为因不同的前处理器宏和特定架构的功能而不同,例如不同的字符尺寸、呼叫方式与大小尾序等。后端接口的前半部利用这些讯息决定其RTL的生成形式,因此虽然GCC的RTL理论上不受处理器影响,但在此阶段其抽象指令已被转换成目标架构的格式。 GCC的最佳化技巧依其释出版本而有很大不同,但都包含了标准的最佳化算法,例如循环最

18、佳化、执行绪跳跃、共通程序子句消减、指令排程等等。而RTL的最佳化由于可用的情形较少,且缺乏较高阶的资讯,因此比较起近来增加的GIMPLE语法树形式2,便显得比较不重要。 后端经由一重读取步骤后,利用描述目标处理器的指令集时所取得的资讯,将抽象暂存器替换成处理器的真实暂存器。此阶段非常复杂,因为它必须关照所有GCC可移植平台的处理器指令集的规格与技术细节。 后端的最后步骤相当公式化,仅仅将前一阶段得到的组合语言码藉由简单的副函式转换其暂存器与内存位置成相对应的机械码。 基本规则gcc所遵循的部分约定规则: .c为后缀的文件,C语言源代码文件; .a为后缀的文件,是由目标文件构成的档案库文件;

19、.C,.cc或.cxx 为后缀的文件,是C+源代码文件; .h为后缀的文件,是程序所包含的头文件; .i 为后缀的文件,是已经预处理过的C源代码文件; .ii为后缀的文件,是已经预处理过的C+源代码文件; .m为后缀的文件,是Objective-C源代码文件; .o为后缀的文件,是编译后的目标文件; .s为后缀的文件,是汇编语言源代码文件; .S为后缀的文件,是经过预编译的汇编语言源代码文件。 执行过程虽然我们称Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤预处理(也称预编译,Preprocessing)、编译(Com

20、pilation)、汇编(Assembly)和链接(Linking)。 命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置

21、,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。 基本用法在使用Gcc编译器的时候,我们必须给出一系列必要的调用参数和文件名称。GCC编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数。 GCC最基本的用法是gcc options filenames 其中options就是编译器所需要的参数,filenames给出相关的文件名称。 -c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。 -o output_filename,确定输出文件的名称为

22、output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。 -g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。 -O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。 -O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。 -Idirname,将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情

23、况 A)#include B)#include “myinc.h” 其中,A类使用尖括号(),B类使用双引号(“ ”)。对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而B类,预处理程序在目标文件的文件夹内搜索相应文件。 GCC执行过程示例示例代码 a.c: #include int main() printf(hellon); 预编译过程: 这个过程处理宏定义和include,并做语法检查。 可以看到预编译后,代码从5行扩展到了910行。 gcc -E a.c -o a.i cat a.c | wc -l 5 cat a.i | wc -l 9

24、10 编译过程: 这个阶段,生成汇编代码。 gcc -S a.i -o a.s cat a.s | wc -l 59 汇编过程: 这个阶段,生成目标代码。 此过程生成ELF格式的目标代码。 as a.s -o a.o file a.o a.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped 链接过程: 链接过程。生成可执行代码。链接分为两种,一种是静态链接,另外一种是动态链接。使用静态链接的好处是,依赖的动态链接库较少,对动态链接库的版本不会很敏感,具有较好的兼容性;缺点是生成的程序比较大。使用动态

25、链接的好处是,生成的程序比较小,占用较少的内存。 gcc a.o -o a 程序运行: ./a hello GCC编译简单例子编写如下代码: #include int main() printf(hello,world!n); 执行情况如下: wenjunubuntu:/temp/01$ gcc hello.c -o hello wenjunubuntu:/temp/01$ ls hello hello.c wenjunubuntu:/temp/01$ ./hello hello,world! 目前支持的语言以2006年5月24日释出的4.1.1版为准,本编译器版本可处理下列语言: Ada G

26、NAT C GCC C+(G+) Fortran Fortran 77: G77, Fortran 90: GFORTRAN Java 编译器:GCJ;解释器:GIJ Objective-C GOBJC Objective-C+ 先前版本纳入的CHILL前端由于缺乏维护而被废弃。 Fortran前端在4.0版之前是G77,此前端仅支援Fortran 77。在本版本中,G77被废弃而采用更新的GFortran,因为此前端支援Fortran 95。 下列前端依然存在: Modula-2 Modula-3 Pascal PL/I D语言 Mercury VHDL 支援的处理器架构GCC目前支援下列处

27、理器架构(以4.1版为准): Alpha ARM Atmel AVR Blackfin H8/300 IA-32x86 与x86-64 IA-64例如:Itanium MorphoSys 家族 Motorola 68000 Motorola 88000 MIPS PA-RISC PDP-11 PowerPC System/370,System/390 SuperH HC12 SPARC VAX Renesas R8C/M16C/M32C家族 较不知名的处理器架构也在官方释出版本中支援: A29K ARC C4x CRIS D30V DSP16xx FR-30 FR-V Intel i960 I

28、P2000 M32R 68HC11 MCORE MMIX MN10200 MN10300 NS32K ROMP Stormy16 V850 Xtensa 由FSF个别维护的GCC处理器架构: D10V MicroBlaze PDP-10 MSP430 Z8000 当GCC需要移植到一个新平台上,通常使用此平台固有的语言来撰写其初始阶段。 为GCC 程序除错为 GCC 除错的首选工具当然是 GNU 除错器。其他特殊用途的除错工具是 Valgrind, 用以发现内存漏失 (Memory leak)。而 GNU 测量器 (gprof) 可以得知程序中某些函式花费多少时间,以及其呼叫频率;此功能需要使用者在编译时选定测量profiling选项。 GCC编译器的使用首先检查是否在你的机器上安装了GCC,使用命令: 可用rpm -q gcc检查。 如果没有安装,请依序检查并安装下面各RPM libbinutils binutils make glibc-devel gcc-cpp gcc 看下面的例子:test.c #include main() char *str=I like Linux! I advices you jion in the Linux World; prin

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1