gcc,g++-GNU工程的C和C++编译器

gcc,g++-GNU工程的C和C++编译器
gcc,g++-GNU工程的C和C++编译器

NAME

gcc,g++-GNU工程的C和C++编译器(egcs-1.1.2)

总览(SYNOPSIS)

gcc[option|filename ]...

g++[option|filename ]...

警告(WARNING)

本手册页内容摘自GNU C编译器的完整文档,仅限于解释选项的含义.

除非有人自愿维护,否则本手册页不再更新.如果发现手册页和软件之间有所矛盾,请查对Info 文件, Info文件是权威文档.

如果我们发觉本手册页的内容由于过时而导致明显的混乱和抱怨时,我们就停止发布它.不可能有其他选择,象更新Info文件同时更新man手册,因为其他维护GNU CC的工作没有留给我们时间做这个. GNU工程认为man手册是过时产物,应该把时间用到别的地方.

如果需要完整和最新的文档,请查阅Info文件`gcc'或Using and Porting GNU CC (for version 2.0) (使用和移植GNU CC 2.0) 手册.二者均来自Texinfo原文件

gcc.texinfo.

描述(DESCRIPTION)

C和C++编译器是集成的.他们都要用四个步骤中的一个或多个处理输入文件: 预处理(preprocessing),编译(compilation),汇编(assembly)和连接(linking).源文件后

缀名标识源文件的语言,但是对编译器来说,后缀名控制着缺省设定:

gcc

认为预处理后的文件(.i)是C文件,并且设定C形式的连接.

g++

认为预处理后的文件(.i)是C++文件,并且设定C++形式的连接.

源文件后缀名指出语言种类以及后期的操作:

.c C源程序;预处理,编译,汇编

.C C++源程序;预处理,编译,汇编

.cc C++源程序;预处理,编译,汇编

.cxx C++源程序;预处理,编译,汇编

.m Objective-C源程序;预处理,编译,汇编

.i预处理后的C文件;编译,汇编

.ii预处理后的C++文件;编译,汇编

.s汇编语言源程序;汇编

.S汇编语言源程序;预处理,汇编

.h预处理器文件;通常不出现在命令行上

其他后缀名的文件被传递给连接器(linker).通常包括:

.o目标文件(Object file)

.a归档库文件(Archive file)

除非使用了-c, -S,或-E选项(或者编译错误阻止了完整的过程),否则连接总是最后的步骤.在连接阶段中,所有对应于源程序的.o文件, -l库文件,无法识别的文件名(包括指定的.o目标文件和.a库文件)按命令行中的顺序传递给连接器.

选项(OPTIONS)

选项必须分立给出: `-dr'完全不同于`-d -r '.

大多数`-f'和`-W'选项有两个相反的格式: -f name和-fno-name (或-W name和

-Wno-name).这里只列举不是默认选项的格式.

下面是所有选项的摘要,按类型分组,解释放在后面的章节中.

总体选项(Overall Option)

-c -S -E -o file -pipe -v -x language

语言选项(Language Option)

-ansi -fall-virtual -fcond-mismatch -fdollars-in-identifiers

-fenum-int-equiv -fexternal-templates -fno-asm -fno-builtin

-fhosted -fno-hosted -ffreestanding -fno-freestanding

-fno-strict-prototype -fsigned-bitfields -fsigned-char

-fthis-is-variable -funsigned-bitfields -funsigned-char

-fwritable-strings -traditional -traditional-cpp -trigraphs

警告选项(Warning Option)

-fsyntax-only -pedantic -pedantic-errors -w -W -Wall

-Waggregate-return -Wcast-align -Wcast-qual -Wchar-subscript

-Wcomment -Wconversion -Wenum-clash -Werror -Wformat

-Wid-clash-len -Wimplicit -Wimplicit-int

-Wimplicit-function-declaration -Winline -Wlong-long -Wmain

-Wmissing-prototypes -Wmissing-declarations -Wnested-externs

-Wno-import -Wparentheses -Wpointer-arith -Wredundant-decls

-Wreturn-type -Wshadow -Wstrict-prototypes -Wswitch

-Wtemplate-debugging -Wtraditional -Wtrigraphs -Wuninitialized -Wunused -Wwrite-strings

调试选项(Debugging Option)

-a -d letters -fpretend-float -g -g level -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)

-fcaller-saves -fcse-follow-jumps -fcse-skip-blocks

-fdelayed-branch -felide-constructors -fexpensive-optimizations -ffast-math -ffloat-store -fforce-addr -fforce-mem

-finline-functions -fkeep-inline-functions -fmemoize-lookups

-fno-default-inline -fno-defer-pop -fno-function-cse -fno-inline -fno-peephole -fomit-frame-pointer -frerun-cse-after-loop

-fschedule-insns -fschedule-insns2 -fstrength-reduce

-fthread-jumps -funroll-all-loops -funroll-loops -O -O2 -O3

预处理器选项(Preprocessor Option)

-A assertion -C -dD -dM -dN -D macro[=defn] -E -H -idirafter dir

-include file -imacros file -iprefix file -iwithprefix dir -M -MD -MM -MMD -nostdinc -P -U macro -undef

汇编器选项(Assembler Option)

-Wa,option

连接器选项(Linker Option)

-l library -nostartfiles -nostdlib -static -shared -symbolic

-Xlinker option -Wl,option -u symbol

目录选项(Directory Option)

-B prefix -I dir -I- -L dir

目标机选项(Target Option)

-b machine -V version

配置相关选项(Configuration Dependent Option)

M680x0 选项

-m68000 -m68020 -m68020-40 -m68030 -m68040 -m68881 -mbitfield

-mc68000 -mc68020 -mfpa -mnobitfield -mrtd -mshort -msoft-float

VAX选项

-mg -mgnu -munix

SPARC选项

-mepilogue -mfpu -mhard-float -mno-fpu -mno-epilogue -msoft-float -msparclite -mv8 -msupersparc -mcypress

Convex选项

-margcount -mc1 -mc2 -mnoargcount

AMD29K选项

-m29000 -m29050 -mbw -mdw -mkernel-registers -mlarge -mnbw -mnodw -msmall -mstack-check -muser-registers

M88K选项

-m88000 -m88100 -m88110 -mbig-pic -mcheck-zero-division

-mhandle-large-shift -midentify-revision

-mno-check-zero-division -mno-ocs-debug-info

-mno-ocs-frame-position -mno-optimize-arg-area

-mno-serialize-volatile -mno-underscores -mocs-debug-info

-mocs-frame-position -moptimize-arg-area -mserialize-volatile

-mshort-data-num -msvr3 -msvr4 -mtrap-large-shift

-muse-div-instruction -mversion-03.00 -mwarn-passed-structs

RS6000选项

-mfp-in-toc -mno-fop-in-toc

RT选项

-mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs

-mfull-fp-blocks -mhc-struct-return -min-line-mul

-mminimum-fp-blocks -mnohc-struct-return

MIPS选项

-mcpu=cpu type -mips2 -mips3 -mint64 -mlong64 -mmips-as -mgas

-mrnames -mno-rnames -mgpopt -mno-gpopt -mstats -mno-stats

-mmemcpy -mno-memcpy -mno-mips-tfile -mmips-tfile -msoft-float

-mhard-float -mabicalls -mno-abicalls -mhalf-pic -mno-half-pic -G num -nocpp

i386选项

-m486 -mno-486 -msoft-float -mno-fp-ret-in-387

HPPA选项

-mpa-risc-1-0 -mpa-risc-1-1 -mkernel -mshared-libs

-mno-shared-libs -mlong-calls -mdisable-fpregs

-mdisable-indexing -mtrailing-colon

i960选项

-m cpu-type -mnumerics -msoft-float -mleaf-procedures

-mno-leaf-procedures -mtail-call -mno-tail-call -mcomplex-addr

-mno-complex-addr -mcode-align -mno-code-align -mic-compat

-mic2.0-compat -mic3.0-compat -masm-compat -mintel-asm

-mstrict-align -mno-strict-align -mold-align -mno-old-align

DEC Alpha选项

-mfp-regs -mno-fp-regs -mno-soft-float -msoft-float

System V选项

-G -Qy -Qn -YP,paths -Ym,dir

代码生成选项(Code Generation Option)

-fcall-saved-reg -fcall-used-reg -ffixed-reg

-finhibit-size-directive -fnonnull-objects -fno-common

-fno-ident -fno-gnu-linker -fpcc-struct-return -fpic -fPIC

-freg-struct-return -fshared-data -fshort-enums -fshort-double

-fvolatile -fvolatile-global -fverbose-asm

总体选项(Overall Option)

-x language

明确指出后面输入文件的语言为language (而不是从文件名后缀得到的默认选择).

这个选项应用于后面所有的输入文件,直到遇着下一个`-x'选项. language的可选

值有`c', `objective-c', `c-header', `c++', `cpp-output',

`assembler',和`assembler-with-cpp'.

-x none

关闭任何对语种的明确说明,因此依据文件名后缀处理后面的文件(就象是从未使用过

`-x'选项).

如果只操作四个阶段(预处理,编译,汇编,连接)中的一部分,可以使用`-x'选项(或文件名后缀)告诉gcc从哪里开始,用`-c', `-S',或`-E'选项告诉gcc到哪里结束.注意,某些选项组合(例如, `-x cpp-output -E')使gcc不作任何事情.

-c

编译或汇编源文件,但是不作连接.编译器输出对应于源文件的目标文件.

缺省情况下, GCC通过用`.o'替换源文件名后缀`.c', `.i', `.s',等等,产生目

标文件名.可以使用-o选项选择其他名字.

GCC忽略-c选项后面任何无法识别的输入文件(他们不需要编译或汇编).

-S

编译后即停止,不进行汇编.对于每个输入的非汇编语言文件,输出文件是汇编语言文

件.

缺省情况下, GCC通过用`.o'替换源文件名后缀`.c', `.i',等等,产生目标文件名.

可以使用-o选项选择其他名字.

GCC忽略任何不需要编译的输入文件.

-E

预处理后即停止,不进行编译.预处理后的代码送往标准输出.

GCC忽略任何不需要预处理的输入文件.

-o file

指定输出文件为file.该选项不在乎GCC产生什么输出,无论是可执行文件,目标文件,汇编文件还是预处理后的C代码.

由于只能指定一个输出文件,因此编译多个输入文件时,使用`-o'选项没有意义,除非

输出一个可执行文件.

如果没有使用`-o'选项,默认的输出结果是:可执行文件为`a.out',

`source.suffix '的目标文件是`source.o',汇编文件是`source.s',而预处

理后的C源代码送往标准输出.

-v

(在标准错误)显示执行编译阶段的命令.同时显示编译器驱动程序,预处理器,编译器

的版本号.

-pipe

在编译过程的不同阶段间使用管道而非临时文件进行通信.这个选项在某些系统上无法

工作,因为那些系统的汇编器不能从管道读取数据. GNU的汇编器没有这个问题.

语言选项(LANGUAGE OPTIONS)

下列选项控制编译器能够接受的C "方言":

-ansi

支持符合ANSI标准的C程序.

这样就会关闭GNU C中某些不兼容ANSI C的特性,例如asm, inline和typeof

关键字,以及诸如unix和vax这些表明当前系统类型的预定义宏.同时开启不受欢迎

和极少使用的ANSI trigraph特性,以及禁止`$'成为标识符的一部分.

尽管使用了`-ansi'选项,下面这些可选的关键字, __asm__, __extension__,

__inline__和__typeof__仍然有效.你当然不会把他们用在ANSI C程序中,但可

以把他们放在头文件里,因为编译包含这些头文件的程序时,可能会指定`-ansi'选项.

另外一些预定义宏,如__unix__和__vax__,无论有没有使用`-ansi'选项,始终有

效.

使用`-ansi'选项不会自动拒绝编译非ANSI程序,除非增加`-pedantic'选项作为

`-ansi'选项的补充.

使用`-ansi'选项的时候,预处理器会预定义一个__STRICT_ANSI__宏.有些头文件

关注此宏,以避免声明某些函数,或者避免定义某些宏,这些函数和宏不被ANSI标准调

用;这样就不会干扰在其他地方使用这些名字的程序了.

-fno-asm

不把asm, inline或typeof当作关键字,因此这些词可以用做标识符.用__asm__, __inline__和__typeof__能够替代他们. `-ansi' 隐含声明了`-fno-asm'.

-fno-builtin

不接受不是两个下划线开头的内建函数(built-in function).目前受影响的函数有_exit, abort, abs, alloca, cos, exit, fabs, labs, memcmp, memcpy, sin, sqrt, strcmp, strcpy,和strlen.

`-ansi'选项能够阻止alloca和_exit成为内建函数.

-fhosted

按宿主环境编译;他隐含声明了`-fbuiltin'选项,而且警告不正确的main函数声

明.

-ffreestanding

按独立环境编译;他隐含声明了`-fno-builtin'选项,而且对main函数没有特别要

求.

(译注:宿主环境(hosted environment)下所有的标准库可用, main函数返回一个int值,典型例子是除了内核以外几乎所有的程序.对应的独立环境(freestanding environment)不存在标准库,程序入口也不一定是main,最明显的例子就是操作系

统内核.详情参考gcc网站最近的资料)

-fno-strict-prototype

对于没有参数的函数声明,例如`int foo ();',按C风格处理---即不说明参数个数

或类型. (仅针对C++).正常情况下,这样的函数foo在C++中意味着参数为空.

-trigraphs

支持ANSI C trigraphs. `-ansi'选项隐含声明了`-trigraphs'.

-traditional

试图支持传统C编译器的某些方面.详见GNU C手册,我们已经把细节清单从这里删除,这样当内容过时后,人们也不会埋怨我们.

除了一件事:对于C++程序(不是C), `-traditional'选项带来一个附加效应,允许

对this赋值.他和`-fthis-is-variable'选项的效果一样.

-traditional-cpp

试图支持传统C预处理器的某些方面.特别是上面提到有关预处理器的内容,但是不包

括`-traditional'选项的其他效应.

-fdollars-in-identifiers

允许在标识符(identifier)中使用`$'字符(仅针对C++).你可以指定

`-fno-dollars-in-identifiers'选项显明禁止使用`$'符. (GNU C++在某些

目标系统缺省允许`$'符,但不是所有系统.)

-fenum-int-equiv

允许int类型到枚举类型(enumeration)的隐式转换(仅限于C++).正常情况下GNU C++允许从enum到int的转换,反之则不行.

-fexternal-templates

为模板声明(template declaration)产生较小的代码(仅限于C++),方法是对于每个模板函数(template function),只在定义他们的地方生成一个副本.想要成功使用这个选项,你必须在所有使用模板的文件中,标记`#pragma implementation'

(定义)或`#pragma interface' (声明).

当程序用`-fexternal-templates'编译时,模板实例(template

instantiation) 全部是外部类型.你必须让需要的实例在实现文件中出现.可以通

过typedef实现这一点,他引用所需的每个实例.相对应的,如果编译时使用缺省选项`-fno-external-templates',所有模板实例明确的设为内置.

-fall-virtual

所有可能的成员函数默认为虚函数.所有的成员函数(除了构造子函数和new或

delete成员操作符)视为所在类的虚函数.

这不表明每次调用成员函数都将通过内部虚函数表.有些情况下,编译器能够判断出可

以直接调用某个虚函数;这时就直接调用.

-fcond-mismatch

允许条件表达式的第二和第三个参数的类型不匹配.这种表达式的值是void.

-fthis-is-variable

允许对this赋值(仅对C++).合并用户自定义的自由存储管理机制到C++后,使可赋值的`this'显得不合时宜.因此,默认情况下,类成员函数内部对this赋值是无效操作.

然而为了向后兼容,你可以通过`-fthis-is-variable'选项使这种操作有效.

-funsigned-char

把char定义为无符号类型,如同unsigned char.

各种机器都有自己缺省的char类型.既可能是unsigned char也可能是signed

char .

理想情况下,当依赖于数据的符号性时,一个可移植程序总是应该使用signed char或unsigned char.但是许多程序已经写成只用简单的char,并且期待这是有符号数(或者无符号数,具体情况取决于编写程序的目标机器).这个选项,和它的反义选项,使那

样的程序工作在对应的默认值上.

char的类型始终应该明确定义为signed char或unsigned char,即使它表现的

和其中之一完全一样.

-fsigned-char

把char定义为有符号类型,如同signed char.

这个选项等同于`-fno-unsigned-char',他是the negative form of

`-funsigned-char'的相反选项.同样, `-fno-signed-char'等价于

`-funsigned-char'.

-fsigned-bitfields

-funsigned-bitfields

-fno-signed-bitfields

-fno-unsigned-bitfields

如果没有明确声明`signed'或`unsigned'修饰符,这些选项用来定义有符号位域

(bitfield)或无符号位域.缺省情况下,位域是有符号的,因为他们继承的基本整数类

型,如int,是有符号数.

然而,如果指定了`-traditional'选项,位域永远是无符号数.

-fwritable-strings

把字符串常量存储到可写数据段,而且不做特别对待.这是为了兼容一些老程序,他们假

设字符串常量是可写的. `-traditional'选项也有相同效果.

篡改字符串常量是一个非常糟糕的想法; ``常量''就应该是常量.

预处理器选项(Preprocessor Option)

下列选项针对C预处理器,预处理器用在正式编译以前,对C 源文件进行某种处理.

如果指定了`-E'选项, GCC只进行预处理工作.下面的某些选项必须和`-E'选项一起才有意义,因为他们的输出结果不能用于编译.

-include file

在处理常规输入文件之前,首先处理文件file,其结果是,文件file的内容先得到编

译. 命令行上任何`-D'和`-U'选项永远在`-include file'之前处理, 无论他们在命令行上的顺序如何.然而`-include'和`-imacros'选项按书写顺序处理.

-imacros file

在处理常规输入文件之前,首先处理文件file,但是忽略输出结果.由于丢弃了文件

file的输出内容, `-imacros file'选项的唯一效果就是使文件file中的宏定义生效, 可以用于其他输入文件.在处理`-imacros file'选项之前,预处理器首先处理

`-D' 和`-U'选项,并不在乎他们在命令行上的顺序.然而`-include'和

`-imacros'选项按书写顺序处理.

-idirafter dir

把目录dir添加到第二包含路径中.如果某个头文件在主包含路径(用`-I'添加的路径)中没有找到,预处理器就搜索第二包含路径.

-iprefix prefix

指定prefix作为后续`-iwithprefix'选项的前缀.

-iwithprefix dir

把目录添加到第二包含路径中.目录名由prefix和dir合并而成,这里prefix被先前的`-iprefix'选项指定.

-nostdinc

不要在标准系统目录中寻找头文件.只搜索`-I'选项指定的目录(以及当前目录,如果

合适).

结合使用`-nostdinc'和`-I-'选项,你可以把包含文件搜索限制在显式指定的目录.

-nostdinc++

不要在C++专用标准目录中寻找头文件,但是仍然搜索其他标准目录. (当建立

`libg++'时使用这个选项.)

-undef

不要预定义任何非标准宏. (包括系统结构标志).

-E

仅运行C预处理器.预处理所有指定的C源文件,结果送往标准输出或指定的输出文件.

-C

告诉预处理器不要丢弃注释.配合`-E'选项使用.

-P

告诉预处理器不要产生`#line'命令.配合`-E'选项使用.

-M [ -MG ]

告诉预处理器输出一个适合make的规则,用于描述各目标文件的依赖关系.对于每个源

文件,预处理器输出一个make规则,该规则的目标项(target)是源文件对应的目标

文件名,依赖项(dependency)是源文件中`#include引用的所有文件.生成的规则

可以是单行,但如果太长,就用`\'-换行符续成多行.规则显示在标准输出,不产生预

处理过的C程序.

`-M'隐含了`-E'选项.

`-MG'要求把缺失的头文件按存在对待,并且假定他们和源程序文件在同一目录下.必

须和`-M'选项一起用.

-MM [ -MG ]

和`-M'选项类似,但是输出结果仅涉及用户头文件,象这样`#include file"'.忽略

系统头文件如`#include '.

-MD

和`-M'选项类似,但是把依赖信息输出在文件中,文件名通过把输出文件名末尾的

`.o'替换为`.d'产生.同时继续指定的编译工作---`-MD'不象`-M'那样阻止正常

的编译任务.

Mach的实用工具`md'能够合并`.d'文件,产生适用于`make'命令的单一的依赖文

件.

-MMD

和`-MD'选项类似,但是输出结果仅涉及用户头文件,忽略系统头文件.

-H

除了其他普通的操作, GCC显示引用过的头文件名.

-A question(answer)

如果预处理器做条件测试,如`#if #question(answer)',该选项可以断言(Assert) question的答案是answer.-A-'关闭一般用于描述目标机的标准断言.

-D macro

定义宏macro,宏的内容定义为字符串`1'.

-D macro=defn

定义宏macro的内容为defn.命令行上所有的`-D'选项在`-U'选项之前处理.

-U macro

取消宏macro. `-U'选项在所有的`-D'选项之后处理,但是优先于任何`-include'

或`-imacros'选项.

-dM

告诉预处理器输出有效的宏定义列表(预处理结束时仍然有效的宏定义).该选项需结合

`-E'选项使用.

-dD

告诉预处理器把所有的宏定义传递到输出端,按照出现的顺序显示.

-dN

和`-dD'选项类似,但是忽略宏的参量或内容.只在输出端显示`#define name.

汇编器选项(ASSEMBLER OPTION)

-Wa,option

把选项option传递给汇编器.如果option含有逗号,就在逗号处分割成多个选项.

连接器选项(LINKER OPTION)

下面的选项用于编译器连接目标文件,输出可执行文件的时候.如果编译器不进行连接,他们就

毫无意义.

object-file-name

如果某些文件没有特别明确的后缀a special recognized suffix, GCC就认为

他们是目标文件或库文件. (根据文件内容,连接器能够区分目标文件和库文件).如果

GCC执行连接操作,这些目标文件将成为连接器的输入文件.

-l library

连接名为library的库文件.

连接器在标准搜索目录中寻找这个库文件,库文件的真正名字是`lib library.a'.连

接器会当做文件名得到准确说明一样引用这个文件.

搜索目录除了一些系统标准目录外,还包括用户以`-L'选项指定的路径.

一般说来用这个方法找到的文件是库文件---即由目标文件组成的归档文件(archive

file).连接器处理归档文件的方法是:扫描归档文件,寻找某些成员,这些成员的符号

目前已被引用,不过还没有被定义.但是,如果连接器找到普通的目标文件,而不是库文

件,就把这个目标文件按平常方式连接进来.指定`-l'选项和指定文件名的唯一区别是, `-l选项用`lib'和`.a'把library包裹起来,而且搜索一些目录.

-lobjc

这个-l选项的特殊形式用于连接Objective C程序.

-nostartfiles

不连接系统标准启动文件,而标准库文件仍然正常使用.

-nostdlib

不连接系统标准启动文件和标准库文件.只把指定的文件传递给连接器.

-static

在支持动态连接(dynamic linking)的系统上,阻止连接共享库.该选项在其他系统

上无效.

-shared

生成一个共享目标文件,他可以和其他目标文件连接产生可执行文件.只有部分系统支

持该选项.

-symbolic

建立共享目标文件的时候,把引用绑定到全局符号上.对所有无法解析的引用作出警告

(除非用连接编辑选项`-Xlinker -z -Xlinker defs'取代).只有部分系统支持

该选项.

-Xlinker option

把选项option传递给连接器.可以用他传递系统特定的连接选项, GNU CC无法识别

这些选项.

如果需要传递携带参数的选项,你必须使用两次`-Xlinker',一次传递选项,另一次传

递他的参数. 例如,如果传递`-assert definitions',你必须写成`-Xlinker

-assert -Xlinker definitions',而不能写成`-Xlinker "-assert

definitions"',因为这样会把整个字符串当做一个参数传递,显然这不是连接器期

待的.

-Wl,option

把选项option传递给连接器.如果option中含有逗号,就在逗号处分割成多个选项. -u symbol

使连接器认为取消了symbol的符号定义,从而连接库模块以取得定义.你可以使用多

个`-u'选项,各自跟上不同的符号,使得连接器调入附加的库模块.

目录选项(DIRECTORY OPTION)

下列选项指定搜索路径,用于查找头文件,库文件,或编译器的某些成员:

-I dir

在头文件的搜索路径列表中添加dir 目录.

-I-

任何在`-I-'前面用`-I'选项指定的搜索路径只适用于`#include "file"'这种情

况;他们不能用来搜索`#include '包含的头文件.

如果用`-I'选项指定的搜索路径位于`-I-'选项后面,就可以在这些路径中搜索所有

的`#include'指令. (一般说来-I选项就是这么用的.)

还有, `-I-'选项能够阻止当前目录(存放当前输入文件的地方)成为搜索`#include "file"'的第一选择.没有办法克服`-I-'选项的这个效应.你可以指定`-I.'搜索那个目录,它在调用编译器时是当前目录.这和预处理器的默认行为不完全一样,但是结果

通常令人满意.

`-I-'不影响使用系统标准目录,因此, `-I-'和`-nostdinc'是不同的选项.

-L dir

在`-l'选项的搜索路径列表中添加dir目录.

-B prefix

这个选项指出在何处寻找可执行文件,库文件,以及编译器自己的数据文件.

编译器驱动程序需要执行某些下面的子程序: `cpp', `cc1' (或C++的

`cc1plus'), `as'和`ld'.他把prefix当作欲执行的程序的前缀,既可以包括也可以不包括`machine/version/'.

对于要运行的子程序,编译器驱动程序首先试着加上`-B'前缀(如果存在).如果没有找到文件,或没有指定`-B'选项,编译器接着会试验两个标准前缀`/usr/lib/gcc/'

和`/usr/local/lib/gcc-lib/'.如果仍然没能够找到所需文件,编译器就在

`PATH'环境变量指定的路径中寻找没加任何前缀的文件名.

如果有需要,运行时(run-time)支持文件`libgcc.a'也在`-B'前缀的搜索范围之

内. 如果这里没有找到,就在上面提到的两个标准前缀中寻找,仅此而已.如果上述方法没有找到这个文件,就不连接他了.多数情况的多数机器上, `libgcc.a'并非必不可少.

你可以通过环境变量GCC_EXEC_PREFIX获得近似的效果;如果定义了这个变量,其值就和上面说的一样用做前缀.如果同时指定了`-B'选项和GCC_EXEC_PREFIX变量,编译器首先使用`-B'选项,然后才尝试环境变量值.

警告选项(WARNING OPTION)

警告是针对程序结构的诊断信息,程序不一定有错误,而是存在风险,或者可能存在错误.

下列选项控制GNU CC产生的警告的数量和类型:

-fsyntax-only

检查程序中的语法错误,但是不产生输出信息.

-w

禁止所有警告信息.

-Wno-import

禁止所有关于#import的警告信息.

-pedantic

打开完全服从ANSI C标准所需的全部警告诊断;拒绝接受采用了被禁止的语法扩展的程序.

无论有没有这个选项,符合ANSI C标准的程序应该能够被正确编译(虽然极少数程序需要`-ansi' 选项).然而,如果没有这个选项,某些GNU扩展和传统C特性也得到支持.

使用这个选项可以拒绝这些程序.没有理由使用这个选项,他存在只是为了满足一些书呆子(pedant).

对于替选关键字(他们以`__'开始和结束) `-pedantic'不会产生警告信息.

Pedantic 也不警告跟在__extension__后面的表达式.不过只应该在系统头文件中使用这种转义措施,应用程序最好避免.

-pedantic-errors

该选项和`-pedantic'类似,但是显示错误而不是警告.

-W

对下列事件显示额外的警告信息:

*

非易变自动变量(nonvolatile automatic variable)可能在调用longjmp时发

生改变. 这些警告仅在优化编译时发生.

编译器只知道对setjmp的调用,他不可能知道会在哪里调用longjmp,事实上一个信号处理例程可以在程序的任何地点调用他.其结果是,即使程序没有问题,你也可能会得

到警告,因为无法在可能出现问题的地方调用longjmp.

*

既可以返回值,也可以不返回值的函数. (缺少结尾的函数体被看作不返回函数值)例如,下面的函数将导致这种警告:

foo (a)

{

if (a > 0)

return a;

}

由于GNU CC不知道某些函数永不返回(含有abort和longjmp),因此有可能出现虚假警告.

*

表达式语句或逗号表达式的左侧没有产生作用(side effect).如果要防止这种警告,应该把未使用的表达式强制转换为void类型.例如,这样的表达式`x[i,j]'会导致

警告,而`x[(void)i,j]'就不会.

*

无符号数用`>'或`<='和零做比较.

-Wimplicit-int

警告没有指定类型的声明.

-Wimplicit-function-declaration

警告在声明之前就使用的函数.

-Wimplicit

同-Wimplicit-int和-Wimplicit-function-declaration.

-Wmain

如果把main函数声明或定义成奇怪的类型,编译器就发出警告.典型情况下,这个函数

用于外部连接, 返回int数值,不需要参数,或指定两个参数.

-Wreturn-type

如果函数定义了返回类型,而默认类型是int型,编译器就发出警告.同时警告那些不带返回值的return语句,如果他们所属的函数并非void类型.

-Wunused

如果某个局部变量除了声明就没再使用,或者声明了静态函数但是没有定义,或者某条

语句的运算结果显然没有使用, 编译器就发出警告.

-Wswitch

如果某条switch语句的参数属于枚举类型,但是没有对应的case语句使用枚举元素,编译器就发出警告. ( default语句的出现能够防止这个警告.)超出枚举范围的

case语句同样会导致这个警告.

-Wcomment

如果注释起始序列`/*'出现在注释中,编译器就发出警告.

-Wtrigraphs

警告任何出现的trigraph (假设允许使用他们).

-Wformat

检查对printf和scanf等函数的调用,确认各个参数类型和格式串中的一致.

-Wchar-subscripts

警告类型是char的数组下标.这是常见错误,程序员经常忘记在某些机器上char有符号.

-Wuninitialized

在初始化之前就使用自动变量.

这些警告只可能做优化编译时出现,因为他们需要数据流信息,只有做优化的时候才估

算数据流信息.如果不指定`-O'选项,就不会出现这些警告.

这些警告仅针对等候分配寄存器的变量.因此不会发生在声明为volatile的变量上面,不会发生在已经取得地址的变量,或长度不等于1, 2, 4, 8字节的变量.同样也不会发生在结构,联合或数组上面,即使他们在寄存器中.

注意,如果某个变量只计算了一个从未使用过的值,这里可能不会警告.因为在显示警告

之前,这样的计算已经被数据流分析删除了.

这些警告作为可选项是因为GNU CC还没有智能到判别所有的情况,知道有些看上去错

误的代码其实是正确的.下面是一个这样的例子:

{

int x;

switch (y)

{

case 1: x = 1;

break;

case 2: x = 4;

break;

case 3: x = 5;

}

foo (x);

}

如果y始终是1, 2或3,那么x总会被初始化,但是GNU CC不知道这一点.下面是另一个普遍案例:

{

int save_y;

if (change_y) save_y = y, y = new_y;

...

if (change_y) y = save_y;

}

这里没有错误,因为只有设置了save_y才使用他.

把所有不返回的函数定义为volatile可以避免某些似是而非的警告.

-Wparentheses

在某些情况下如果忽略了括号,编译器就发出警告.

-Wtemplate-debugging

当在C++程序中使用template的时候,如果调试(debugging)没有完全生效,编译器

就发出警告. (仅用于C++).

-Wall

结合所有上述的`-W'选项.通常我们建议避免这些被警告的用法,我们相信,恰当结合

宏的使用能够轻易避免这些用法。

剩下的`-W...'选项不包括在`-Wall'中,因为我们认为在必要情况下,这些被编译器警告的

程序结构,可以合理的用在"干净的"程序中.

-Wtraditional

如果某些程序结构在传统C中的表现和ANSI C不同,编译器就发出警告.

*

宏参出现在宏体的字符串常量内部.传统C会替换宏参,而ANSI C则视其为常量的一部

分.

*

某个函数在块(block)中声明为外部,但在块结束后才调用.

*

switch语句的操作数类型是long.

-Wshadow

一旦某个局部变量屏蔽了另一个局部变量,编译器就发出警告.

-Wid-clash-len

一旦两个确定的标识符具有相同的前len个字符,编译器就发出警告.他可以协助你开

发一些将要在某些过时的,危害大脑的编译器上编译的程序.

-Wpointer-arith

任何语句如果依赖于函数类型的大小(size)或者void类型的大小,编译器就发出警告.

GNU C为了便于计算void *指针和函数指针,就把这些类型的大小定义为1.

-Wcast-qual

一旦某个指针强制类型转换以便移除类型修饰符时,编译器就发出警告.例如,如果把

const char *强制转换为普通的char *时,警告就会出现.

-Wcast-align

一旦某个指针类型强制转换时,导致目标所需的地址对齐(alignment)增加,编译器就

发出警告.例如,某些机器上只能在2或4字节边界上访问整数,如果在这种机型上把

char *强制转换成int *类型, 编译器就发出警告.

-Wwrite-strings

规定字符串常量的类型是const char[length],因此,把这样的地址复制给

non-const char *指针将产生警告.这些警告能够帮助你在编译期间发现企图写入字

符串常量的代码,但是你必须非常仔细的在声明和原形中使用const,否则他们只能带来麻烦;所以我们没有让`-Wall'提供这些警告.

-Wconversion

如果某函数原形导致的类型转换和无函数原形时的类型转换不同,编译器就发出警告.

这里包括定点数和浮点数的互相转换,改变定点数的宽度或符号,除非他们和缺省声明

(default promotion)相同.

-Waggregate-return

如果定义或调用了返回结构或联合的函数,编译器就发出警告. (从语言角度你可以返

回一个数组,然而同样会导致警告.)

-Wstrict-prototypes

如果函数的声明或定义没有指出参数类型,编译器就发出警告. (如果函数的前向引用

说明指出了参数类型,则允许后面使用旧式风格的函数定义,而不会产生警告.)

-Wmissing-prototypes

如果没有预先声明函数原形就定义了全局函数,编译器就发出警告.即使函数定义自身

提供了函数原形也会产生这个警告. 他的目的是检查没有在头文件中声明的全局函数. -Wmissing-declarations

如果没有预先声明就定义了全局函数,编译器就发出警告.即使函数定义自身提供了函

数原形也会产生这个警告.这个选项的目的是检查没有在头文件中声明的全局函数.

-Wredundant-decls

如果在同一个可见域某定义多次声明,编译器就发出警告,即使这些重复声明有效并且

毫无差别.

-Wnested-externs

如果某extern声明出现在函数内部,编译器就发出警告.

-Wenum-clash

对于不同枚举类型之间的转换发出警告(仅适用于C++).

-Wlong-long

如果使用了long long 类型就发出警告.该警告是缺省项.使用`-Wno-long-long' 选项能够防止这个警告. `-Wlong-long'和`-Wno-long-long'仅在

`-pedantic'之下才起作用.

-Woverloaded-virtual

(仅适用于C++.)在继承类中,虚函数的定义必须匹配虚函数在基类中声明的类型特征

(type signature).当继承类声明了某个函数,它可能是个错误的尝试企图定义一

个虚函数,使用这个选项能够产生警告:就是说,当某个函数和基类中的虚函数同名,但

是类型特征不符合基类的任何虚函数,编译器将发出警告.

-Winline

如果某函数不能内嵌(inline),无论是声明为inline或者是指定了

-finline-functions选项,编译器都将发出警告.

-Werror

视警告为错误;出现任何警告即放弃编译.

调试选项(DEBUGGING OPTION)

GNU CC拥有许多特别选项,既可以调试用户的程序,也可以对GCC排错:

-g

以操作系统的本地格式(stabs, COFF, XCOFF,或DWARF).产生调试信息. GDB能

够使用这些调试信息.

在大多数使用stabs格式的系统上, `-g'选项启动只有GDB才使用的额外调试信息;

这些信息使GDB 调试效果更好,但是有可能导致其他调试器崩溃,或拒绝读入程序.如

果你确定要控制是否生成额外的信息, 使用`-gstabs+', `-gstabs',

`-gxcoff+', `-gxcoff', `-gdwarf+',或`-gdwarf' (见下文).

和大多数C编译器不同, GNU CC允许结合使用`-g'和`-O'选项.优化的代码偶尔制

造一些惊异的结果:某些声明过的变量根本不存在;控制流程直接跑到没有预料到的地

方;某些语句因为计算结果是常量或已经确定而没有执行;某些语句在其他地方执行,

因为他们被移到循环外面了.

然而它证明了调试优化的输出是可能的.对可能含有错误的程序使用优化器是合理的.

如果GNU CC支持输出多种调试信息,下面的选项则非常有用.

-ggdb

以本地格式(如果支持)输出调试信息,尽可能包括GDB扩展.

-gstabs

以stabs格式(如果支持)输出调试信息,不包括GDB扩展.这是大多数BSD系统上DBX 使用的格式.

-gstabs+

以stabs格式(如果支持)输出调试信息,使用只有GNU调试器(GDB)理解的GNU扩展.

使用这些扩展有可能导致其他调试器崩溃或拒绝读入程序.

-gcoff

以COFF格式(如果支持)输出调试信息.这是在System V第四版以前的大多数System V系统上SDB使用的格式.

-gxcoff

以XCOFF格式(如果支持)输出调试信息.这是IBM RS/6000系统上DBX调试器使用

的格式.

-gxcoff+

以XCOFF格式(如果支持)输出调试信息,使用只有GNU调试器(GDB)理解的GNU扩展.

使用这些扩展有可能导致其他调试器崩溃或拒绝读入程序.

-gdwarf

以DWARF格式(如果支持)输出调试信息.这是大多数System V第四版系统上SDB使

用的格式.

-gdwarf+

以DWARF格式(如果支持)输出调试信息,使用只有GNU调试器(GDB)理解的GNU扩展.

使用这些扩展有可能导致其他调试器崩溃或拒绝读入程序.

-g level

-ggdb level

-gstabs level

-gcoff level-gxcoff level

-gdwarf level

请求生成调试信息,同时用level指出需要多少信息.默认的level值是2.

Level 1输出最少量的信息,仅够在不打算调试的程序段内backtrace.包括函数和外

部变量的描述,但是没有局部变量和行号信息.

Level 3包含更多的信息,如程序中出现的所有宏定义.当使用`-g3'选项的时候,某些

调试器支持宏扩展.

-p

产生额外代码,用于输出profile信息,供分析程序prof使用.

-pg

产生额外代码,用于输出profile信息,供分析程序gprof使用.

-a

产生额外代码,用于输出基本块(basic block)的profile信息,它记录各个基本块

的执行次数,供诸如tcov此类的程序分析.但是注意,这个数据格式并非tcov期待的.

最终GNU gprof将处理这些数据.

-ax

产生额外代码,用于从'bb.in'文件读取基本块的profile参数,把profile的结果

写到'bb.out' 文件. `bb.in'包含一张函数列表.一旦进入列表中的某个函数,

profile操作就开始,离开最外层的函数后, profile操作就结束.以`-'为前缀名的

函数排除在profile操作之外.如果函数名不是唯一的,它可以写成

`/path/filename.d:functionname'来澄清. `bb.out'将列出一些有效的文件

名.这四个函数名具有特殊含义: `__bb_jumps__'导致跳转(jump)频率写进

`bb.out'. `__bb_trace__'导致基本块序列通过管道传到`gzip',输出

`bbtrace.gz'文件. `__bb_hidecall__'导致从跟踪(trace)中排除call 指令.

`__bb_showret__'导致在跟踪中包括返回指令.

-d letters

编译的时候,在letters指定的时刻做调试转储(dump).用于调试编译器.大多数转储

的文件名通过源文件名添加字词获得(例如`foo.c.rtl'或`foo.c.jump').

-dM

预处理结束的时候转储所有的宏定义,不输出到文件.

-dN

预处理结束的时候转储所有的宏名.

-dD

预处理结束的时候转储所有的宏定义,同时进行正常输出.

-dy

语法分析(parse)的时候在标准错误转储调试信息.

-dr

RTL阶段后转储到`file.rtl'.

-dx

仅对函数生成RTL,而不是编译.通常和`r'联用.

-dj

第一次跳转优化后转储到`file.jump'.

-ds

CSE (包括有时候跟在CSE后面的跳转优化)后转储到`file.cse'.

-dL

循环优化后转储到`file.loop'.

-dt

第二次CSE处理(包括有时候跟在CSE后面的跳转优化)后转储到`file.cse2'.

-df

流程分析(flow analysis)后转储到`file.flow'.

-dc

指令组合(instruction combination)后转储到`https://www.360docs.net/doc/df12290182.html,bine'.

-dS

第一次指令安排(instruction schedule)后转储到`file.sched'.

-dl

局部寄存器分配后转储到`file.lreg'.

-dg

全局寄存器分配后转储到`file.greg'.

-dR

第二次指令安排(instruction schedule)后转储到`file.sched2'.

-dJ

最后一次跳转优化后转储到`file.jump2'.

-dd

推迟分支调度(delayed branch scheduling)后转储到`file.dbr'.

-dk

寄存器-堆栈转换后转储到`file.stack'.

-da

产生以上所有的转储.

-dm

运行结束后,在标准错误显示内存使用统计.

-dp

在汇编输出加注指明使用了哪些模式(pattern)及其替代模式.

-fpretend-float

交叉编译的时候,假定目标机和宿主机使用同样的浮点格式.它导致输出错误的浮点常

数,但是在目标机上运行的时候, 真实的指令序列有可能和GNU CC希望的一样.

-save-temps

保存那些通常是``临时''的中间文件;置于当前目录下,并且根据源文件命名.因此,用`-c -save-temps'选项编译`foo.c '会生成` foo.cpp'和`foo.s' 以及

`foo.o'文件.

gcc编译器使用简明指南

gcc编译器使用简明指南 gcc对文件的处理需要经过预处理->编译->汇编->链接的步骤,从而产生一个可执行文件,各部分对应不同的文件类型,具体如下: file.c c程序源文件 file.i c程序预处理后文件 file.cxx c++程序源文件,也可以是https://www.360docs.net/doc/df12290182.html, / file.cpp / file.c++ file.ii c++程序预处理后文件 file.h c/c++头文件 file.s 汇编程序文件 file.o 目标代码文件 gcc [选项]文件列表 -ansi 强制完全ANSI一致 -c 仅编译或汇编,生成目标代码文件,将.c、.i、.s等文件生成.o文件,其余文件被忽略 -S 仅编译,不进行汇编和链接,将.c、.i等文件生成.s文件,其余文件被忽略 -E 仅预处理,并发送预处理后的.i文件到标准输出,其余文件被忽略 -o file 创建可执行文件并保存在file中,而不是默认文件a.out -g 产生用于调试和排错的扩展符号表,用于GDB调试,切记-g和-O通常不能一起使用 -w 取消所有警告 -W 给出更详细的警告 -O [num]优化,可以指定0-3作为优化级别,级别0表示没有优化 -x language 默认为-x none,即依靠后缀名确定文件类型,加上-x lan确定后面所有文件类型,直到下一个-x出现为止 -D macro[=]类似于源程序里的#define,在-D macro中的macro可被源程序识别,例如gcc -D NUM -D FILE=\"bbs.txt\" hello.c -o hello,第一个-D选项定义宏NUM,在程序中可以使用#ifdef来检查是否被设置,第二个-D定义宏FILE,在源程序中可用 -U macro 类似于源程序开头定义#undef macro,也就是取消源程序中的某个宏定义

gcc编译器的下载和安装教程_华清远见

gcc编译器的下载和安装教程 今天分享的教程是gcc编译器的下载和安装教程,大家可以跟着教程一起来实现他! Linux下变成的源码要运行,必须先转成二进制的机器码。此时就需要编译器,Linux系统下的Gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。 Gcc编译器能将C、C++语言源程序通过编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件。 比如,下面这段源码(文件名叫做test.c)。 #include int main(void) { printf("Hello, world!\n"); return 0; } 编译则使用gcc命令,gcc命令提供了非常多的命令选项。 一. 常用编译命令选项 假设源程序文件名为test.c。 1. 无选项编译链接 用法:#gcc test.c 作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out,如果需要执行,内核中必须支持该文件的格式,默认一般都是elf可执行程序 2. 选项 -o 用法:#gcc test.c -o test 作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。 3. 选项 -E

用法:#gcc -E test.c -o test.i 作用:将test.c预处理输出test.i文件,预处理其实就是处理#预处理符号,比如#include, #define, #if, #ifdef, #error等 4. 选项 -S 用法:#gcc -S test.i 作用:将预处理输出文件test.i汇编成test.s文件。汇编语言对应汇编指令,默认gcc编译成x86指令,如果需要编译arm架构的,就必须使用交叉工具链 5. 选项 -c 用法:#gcc -c test.s 作用:将汇编输出文件test.s编译输出test.o文件,二进制文件就是101010机器码 6. 无选项链接 用法:#gcc test.o -o test 作用:将编译输出文件test.o链接成最终可执行文件test。 如果需要修改Ubuntu的gcc版本,可以看一下你的Ubuntu安装了哪些版本的gcc 用命令:ls /usr/bin/gcc* -l 显示是 lrwxrwxrwx 1 root root 7 2017-08-14 15:17 /usr/bin/gcc -> gcc-4.6 -rwxr-xr-x 1 root root 302104 2017-09-17 05:43 /usr/bin/gcc-4.6 由上面显示可以看出默认安装的是gcc-4.6,现在来改成gcc-4.7 $ sudo apt-get install gcc-4.7 $ sudo apt-get install g++-4.7 删除gcc-4.6的软连接文件/usr/bin/gcc。(只是删除软连接) 命令:sudo rm /usr/bin/gcc 然后建一个软连接,指向gcc-4.7。 命令:sudo ln -s /usr/bin/gcc-4.7 /usr/bin/gcc 然后可以通过命令:gcc -v 查看版本

gcc语言编译原理_CompilingBinaryFilesUsingACompiler

Making plain binary?les using a C compiler(i386+) Cornelis Frank April10,2000 I wrote this article because there isn’t much information on the Internet concerning this topic and I needed this for the EduOS project. No liability is assumed for incidental or consequential damages in connection with or arising out of use of the information or programs contained herein. So if you blow up your computer because of my bad“English”that’s your problem not mine. 1Which tools do you need? An i386PC or higher. A Linux distribution like Red Hat or Slackware. GNU GCC compiler.This C compiler usually comes with Linux.To check if you’re having GCC type the following at the prompt: gcc--version This should give an output like: 2.7.2.3 The number probably will not match the above one,but that doesn’t really matter. The binutils for Linux. NASM Version0.97or higher.The Netwide Assembler,NASM,is an80x86assembler designed for portability and modularity.It supports a range of object?le formats,including Linux‘a.out’and ELF,NetBSD/FreeBSD,COFF,Microsoft16-bit OBJ and Win32.It will also output plain binary?les.Its syntax is designed to be simple and easy to understand, similar to Intel’s but less complex.It supports Pentium,P6and MMX opcodes,and has macro capability. Normally you don’t have NASM on your system.Download it from: https://www.360docs.net/doc/df12290182.html,/pub/Linux/devel/lang/assemblers/ A text editor like pico or emacs.

gcc命令行详解

gcc命令行详解 1、gcc包含的c/c++编译器 gcc、cc、c++、g++ gcc和cc是一样的,c++和g++是一样的,一般c程序就用gcc编译,c++程序就用g++编译 2、gcc的基本用法 gcc test.c这样将编译出一个名为a.out的程序 gcc test.c -o test这样将编译出一个名为test的程序 -o参数用来指定生成程序的名字 3、为什么会出现undefined reference to 'xxxxx'错误? 首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得不对,你没有指定链接程序要用到得库,比如你的程序里用到了一些数学函数,那么你就要在编译参数里指定程序要链接数学库,方法是在编译命令行里加入-lm 4、-l参数和-L参数 -l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?-lname,在连接时,装载名字为“libname.a”的函数库:-lm表示连接名为“libm.a”的数学函数库。就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了 好了现在我们知道怎么得到库名,当我们自已要用到一个第三方提供的库名字libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件) 放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它在/usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是 -L/aaa/bbb/ccc -ltest 另外,大部分libxxxx.so只是一个链接,以RH9为例,比如libm.so它链接到/lib/libm.s o.x,/lib/libm.so.6又链接到/lib/libm-2.3.2.so, 如果没有这样的链接,还是会出错,因为ld只会找libxxxx.so,所以如果你要用到xxxx 库,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个链接就可以了 ln -s libxxxx-x.x.x.so libxxxx.so 手工来写链接参数总是很麻烦的,还好很多库开发包提供了生成链接参数的程序,名字一般叫xxxx-config,一般放在/usr/bin目录下,比如 gtk1.2的链接参数生成程序是gtk-config,执行gtk-config --libs就能得到以下输出"- L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic

1、GCC编译器的使用

linux下gcc编译器的使用 1、文件后缀名 .c C 源程序 .C C++ 源程序 .cc C++ 源程序 .cxx C++ 源程序 .m Objective –C源程序 .i 预处理过的c源程序 .ii 预处理过的C++源程序 .s 组合语言源程序 .S 组合语言源程序 .h 头文件 .o 目标文件 .a 存档文件 2、GCC常用选项 -c 通知GCC取消链接步骤,即编译源码并在最后生成目标文件; -Dmacro定义指定的宏,使它能够通过源码中的#ifdef进行检验 #define -static 指定程序编译时采用静态编译的方法; -E 不经过编译预处理程序的输出而输送至标准输出; -g获得有关调试程序的详细信息,它不能与-o选项联合使用; -Idirectory在包含文件搜索路径的起点处添加指定目录; -llibrary提示链接程序在创建最终可执行文件时包含指定的库; -O、-O2、-O3将优化状态打开,该选项不能与-g选项联合使用; -S要求编译程序生成来自源代码的汇编程序输出; -v启动所有警报; -Wall发生警报时取消编译操作,即将警报看作是错误; -Werror在发生警报时取消编译操作,即把报警当作是错误; -w 禁止所有的报警。 目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。GCC不仅功能非常强大,结构也异常灵活。最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、 Fortran、Pascal、Modula-3和Ada等。开放、自由和灵活是Linux的魅力所在,而这一点在GCC上的体现就是程序员通过它能够更好地控制整个编译过程。

linux 编译器gcc

1.8 Linux 上的C/C++ 编译器和调试器 https://www.360docs.net/doc/df12290182.html,/man/linux_tsinghua/compiler.html ?运行 gcc/egcs ?gcc/egcs 的主要选项 ?gdb ?gdb 的常用命令 ?gdb 使用范例 ?其他程序/库工具 (ar, objdump, nm, size, strings, strip, ...) 1.8.1 运行 gcc/egcs Linux 中最重要的软件开发工具是 GCC。GCC 是 GNU 的 C 和 C++ 编译器。实际上,GCC 能够编译三种语言:C、C++ 和 Object C(C 语言的一种面向对象扩展)。利用 gcc 命令可同时编译并连接 C 和 C++ 源程序。 #DEMO#: hello.c 如果你有两个或少数几个 C 源文件,也可以方便地利用 GCC 编译、连接并生成可执行文件。例如,假设你有 两个源文件 main.c 和 factorial.c 两个源文件,现在要编译生成一个计算阶乘的程序。 清单 factorial.c ----------------------- #include #include int factorial (int n) { if (n <= 1) return 1; else return factorial (n - 1) * n; } ----------------------- ----------------------- 清单 main.c ----------------------- #include #include

实验三 vi编辑器及GCC编译器的使用

实验三vi编辑器及GCC编译器的使用 【实验目的】 一、掌握文本编辑器vi的使用方法 二、了解GNU gcc编译器 三、掌握使用GCC编译C语言程序的方法 【实验内容】 一、vi的三种工作模式: 1、命令模式: 执行相关文本编辑命令 2、输入模式: 输入文本 3、末行模式: 实现查找、替换、保存、多文件操作等等功能 二、进入vi,直接在Shell提示符下键入vi [文件名称],如果该文件在当前目录不存在,则vi创建之。 三、退出vi 1、在命令模式下输入“: wq”,保存文件并退出vi 2、若不需要保存文件,输入“: q” 3、若文件已修改,但不保存,输入“:

q!”强制退出vi 4、其它一些不常用的方法在此省略。 四、命令模式下的常用编辑命令 1、启动vi后,进入的是vi的命令模式 2、按i键,进入输入模式,可以进行文本的编辑,在输入模式下,按esc 键,可切换回命令模式 i: 光标位置不变,可在光标左侧插入正文 a: 光标位置向后退一格,可在光标左侧插入正文 o: 在光标所在行的下一行增添新行 O: 在光标所在行的上一行增添新行 I: 光标跳到当前行的开头 A: 光标跳到当前行的末尾 3、光标的移动 k、j、h、l分别等同于上、下、左、右箭头键 Ctrl+b,向上翻一页

Ctrl+f,向下翻一页 nH,将光标移到屏幕的第n行 nL,将光标移到屏幕的倒数第n行 4、删除文本 nX,删除光标所指向的后n个字符 D,删除光标右侧的所有字符(包括光标所指向的字符)db,删除光标左侧的全部字符 ndd,删除当前行和当前行以后的n行内容 5、粘贴和复制 p,将缓冲区的内容粘贴到当前字符的右侧 P,将缓冲区的内容粘贴到当前字符的左侧 yy,复制当前行到内存缓冲区 nyy,复制n行内容到内存缓冲区 6、搜索字符串 /str1,正向搜索字符串str1 n,继续搜索 ?str2,反向搜索字符串str2 7、撤销和重复 u,撤销前一条命令的执行结果 .,重复最后一条命令

linux系统下C编译器GCC入门

linux系统下C编译器— gcc 入门 <一>gcc简介 Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。gcc编译器能将C、C++语言源程序、汇程式化序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为 a.out的文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。而gcc则通过后缀来区别输入文件的类别,下面我们来介绍gcc所遵循的部分约定规则。 .c为后缀的文件,C语言源代码文件; .a为后缀的文件,是由目标文件构成的档案库文件; .C,.cc或.cxx 为后缀的文件,是C++源代码文件; .h为后缀的文件,是程序所包含的头文件; .i 为后缀的文件,是已经预处理过的C源代码文件; .ii为后缀的文件,是已经预处理过的C++源代码文件; .m为后缀的文件,是Objective-C源代码文件; .o为后缀的文件,是编译后的目标文件; .s为后缀的文件,是汇编语言源代码文件; .S为后缀的文件,是经过预编译的汇编语言源代码文件。 <二>gcc的执行过程 虽然我们称gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,. S为后缀的汇编语言源代码文件和汇编,.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。 <三>gcc的基本用法和选项 在使用gcc编译器的时候,我们必须给出一系列必要的调用参数和文件名称。g cc编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数。

《Linux操作系统》实验十-UNIX gcc编译器的使用与编程环境

《Linux操作系统》 实验报告 实验十:UNIX gcc编译器的使 用与编程环境

一、实验目的 (1)掌握gcc和g++的用法; (2)了解目标代码、库函数的使用; (3)掌握静态库和共享库的构造与使用; (4)掌握多模块和多语言联合开发方法; (5)掌握make命令和Makefile文件的使用。 二、实验环境 一台装有Windows操作系统PC机,上装有虚拟机系统VMWare,实验过程通过VMWare系统启Linux系统工作。 三、实验内容与实验过程及分析 一、C/C++编程 1、C语言版“Hello World” 用vi编辑一个名为hello.c的文件,其内容为 #include main() { printf(”Hello World! C\n”); } 编译并执行程序。 编译方法为: cc hello.c // 生成可执行程序 a.out cc –o hello hello.c // 生成可执行程序hello cc –c hello.c //生成目标文件hello.o cc –S hello.c //生成汇编语言程序hello.s 执行程序: ./a.out #执行当前目录内,刚编译生成的a.out程序 ./hello #执行当前目录内,刚编译生成的hello程序

2、组合编程 设有C语言文件f1.c,内容为: #include f1(int arg){ printf(”f1: you passed %d\n”,arg); } C语言文件f2.c。内容为: #include f2(char *arg){ printf(”f2: you passed %s\n”,arg); } C语言文件m.c。内容为: #include main(){ f1(16); f2(”Hello World!”); } 请使用vi编辑并生成以上程序,分别用以下方法编译,观察生成文件或运行生成的可执行程序: cc –c f1.c f2.c #生成 f1.o 和 f2.o cc –S f1.c f2.c # 生成 f1.s 和 f2.s;可用vi或cat查看它们的内容cc –o mp m.c f1.c f2.c # 生成mp,执行方法为:./mp cc –o m m.c f1.o f2.o # 生成m,执行方法为:./m

最新GCC编译器选项及优化提示

G C C编译器选项及优 化提示

GCC编译器选项及优化提示 GCC编译器选项及优化提示2010-08-01 19:41很多弟兄可能都很关心如何优化编译自己的程序,虽然本人不赞成"骨灰"玩法,却也不得不承认这是掌握gcc的绝佳途径; 因此献上此帖,以供各位玩家参考,绝对原创噢 = 大多数程序和库在编译时默认的优化级别是"2"(使用gcc选项:"-O2")并且在Intel/AMD平台上默认按照i386处理器来编译。 如果你只想让编译出来的程序运行在特定的平台上,就需要执行更高级的编译器优化选项,以产生只能运行于特定平台的代码。 一种方法是修改每个源码包中的Makefile文件,在其中寻找CFLAGS和CXXFLAGS变量(C和C++编译器的编译选项)并修改它的值。 一些源码包比如binutils,gcc,glibc等等,在每个子文件夹中都有Makefile文件,这样修改起来就太累了! 另一种简易做法是设置CFLAGS和CXXFLAGS环境变量。大多数configure 脚本会使用这两个环境变量代替Makefile文件中的值。 但是少数configure脚本并不这样做,他们必须需要手动编辑才行。 为了设置CFLAGS和CXXFLAGS环境变量,你可以在bash中执行如下命令(也可以写进.bashrc以成为默认值): export CFLAGS="-O3-march="&&CXXFLAGS=$CFLAGS 这是一个确保能够在几乎所有平台上都能正常工作的最小设置。

"-march"选项表示为特定的cpu类型编译二进制代码(不能在更低级别的cpu上运行), Intel通常是: pentium2,pentium3,pentium3m,pentium4,pentium4m,pentium- m,prescott,nocona 说明:pentium3m/pentium4m是笔记本用的移动P3/P4;pentium-m是迅驰I/II代笔记本的cpu; prescott是带SSE3的P4(以滚烫到可以煎鸡蛋而闻名);nocona则是最新的带有EMT64(64位)的P4(同样可以煎鸡蛋) AMD通常是:k6,k6-2,k6-3,athlon,athlon-tbird,athlon-xp,athlon-mp,opteron,athlon64,athlon-fx 用AMD的一般都是DIYer,就不必解释了吧。 如果编译时没有抱怨"segmentation fault,core dumped",那么你设定的"-O"优化参数一般就没什么问题。 否则请降低优化级别("-O3"-"-O2"-"-O1"-取消)。 个人意见:服务器使用"-O2"就可以了,它是最安全的优化参数(集合);桌面可以使用"-O3"; 不鼓励使用过多的自定义优化选项,其实他们之间没什么明显的速度差异(有时"-O3"反而更慢)。 编译器对硬件非常敏感,特别是在使用较高的优化级别的时候,一丁点的内存错误都可能导致致命的失败。 所以在编译时请千万不要超频你的电脑(我编译关键程序时总是先降频然的)。

arm-linux-gcc 常用参数讲解 gcc编译器使用方法

arm-linux-gcc常用参数讲解gcc编译器使用方法 我们需要编译出运行在ARM平台上的代码,所使用的交叉编译器为arm-linux-gcc。下面将arm-linux-gcc编译工具的一些常用命令参数介绍给大家。 在此之前首先介绍下编译器的工作过程,在使用GCC编译程序时,编译过程分为四个阶段: 1. 预处理(Pre-Processing) 2. 编译(Compiling) 3. 汇编(Assembling) 4. 链接(Linking) Linux程序员可以根据自己的需要让GCC在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备。和其它常用的编译器一样,GCC也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。 以文件example.c为例说明它的用法 0. arm-linux-gcc -o example example.c 不加-c、-S、-E参数,编译器将执行预处理、编译、汇编、连接操作直接生成可执行代码。 -o参数用于指定输出的文件,输出文件名为example,如果不指定输出文件,则默认输出 a.out 1. arm-linux-gcc -c -o example.oexample.c -c参数将对源程序example.c进行预处理、编译、汇编操作,生成example.0文件 去掉指定输出选项"-o example.o"自动输出为example.o,所以说在这里-o加不加都可以 2.arm-linux-gcc -S -o example.sexample.c -S参数将对源程序example.c进行预处理、编译,生成example.s文件 -o选项同上 3.arm-linux-gcc -E -o example.iexample.c -E参数将对源程序example.c进行预处理,生成example.i文件(不同版本不一样,有的将预处理后的内容打印到屏幕上) 就是将#include,#define等进行文件插入及宏扩展等操作。 4.arm-linux-gcc -v -o example example.c 加上-v参数,显示编译时的详细信息,编译器的版本,编译过程等。 5.arm-linux-gcc -g -o example example.c -g选项,加入GDB能够使用的调试信息,使用GDB调试时比较方便。 6.arm-linux-gcc -Wall -o example example.c -Wall选项打开了所有需要注意的警告信息,像在声明之前就使用的函数,声明后却没有使用的变量等。 7.arm-linux-gcc -Ox -o example example.c -Ox使用优化选项,X的值为空、0、1、2、3 0为不优化,优化的目的是减少代码空间和提高执行效率等,但相应的编译过程时间将较长并占用较大的内存空间。 8.arm-linux-gcc -I /home/include -o example example.c -Idirname: 将dirname所指出的目录加入到程序头文件目录列表中。如果在预设系统及当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。 9.arm-linux-gcc -L /home/lib -o example example.c

gcc编译器 CFLAGS 标志参数说明

gcc编译器 CFLAGS 标志参数说明2012-11-14 15:10:28 分类:LINUX CFLAGS = -g -O2 -Wall -Werror -Wno-unused 编译出现警告性错误unused-but-set-variable,变量定义但没有使用,解决方法: 增加CFLAGS 或CPPFLAGS参数如下: CPPFLAGS=" -Werror -Wno-unused-but-set-variable" || exit 1 Gcc总体选项列表 后缀名所对应的语言 -S只是编译不汇编,生成汇编代码 -E只进行预编译,不做其他处理 -g在可执行程序中包含标准调试信息 -o file把输出文件输出到file里 -v打印出编译器内部编译各过程的命令行信息和编译器的版本 -I dir在头文件的搜索路径列表中添加dir目录 -L dir在库文件的搜索路径列表中添加dir目录 -static链接静态库 -llibrary连接名为library的库文件 ·“-I dir” 正如上表中所述,“-I dir”选项可以在头文件的搜索路径列表中添加dir目录。由于Linux 中头文件都默认放到了“/usr/include/”目录下,因此,当用户希望添加放置在其他位置的头文件时,就可以通过“-I dir”选项来指定,这样,Gcc就会到相应的位置查找对应的目录。 比如在“/root/workplace/Gcc”下有两个文件: #include int main() { printf(“Hello!!\n”); return 0; } #include

这样,就可在Gcc命令行中加入“-I”选项: [root@localhost Gcc] Gcc hello1.c –I /root/workplace/Gcc/ -o hello1 这样,Gcc就能够执行出正确结果。 小知识 在include语句中,“<>”表示在标准路径中搜索头文件,““”” 表示在本目录中搜索。故在上例中,可把hello1.c的“#include” 改为“#include “my.h””,就不需要加上“-I”选项了。 ·“-L dir” 选项“-L dir”的功能与“-I dir”类似,能够在库文件的搜索路径列表中添加dir目录。 例如有程序hello_sq.c需要用到目录“/root/workplace/Gcc/lib”下的一个动态库 libsunq.so,则只需键入如下命令即可: [root@localhost Gcc] Gcc hello_sq.c –L /root/workplace/Gcc/lib –lsunq –o hello_sq 需要注意的是,“-I dir”和“-L dir”都只是指定了路径,而没有指定文件,因此不能在 路径中包含文件名。 另外值得详细解释一下的是“-l”选项,它指示Gcc去连接库文件libsunq.so。由于在Linux 下的库文件命名时有一个规定:必须以lib三个字母开头。因此在用-l选项指定链接的库 文件名时可以省去lib三个字母。也就是说Gcc在对”-lsunq”进行处理时,会自动去链接 名为 libsunq.so的文件。 (2)告警和出错选项 Gcc的告警和出错选项如表3.8所示。 Gcc总体选项列表 选项含义 -ansi 支持符合ANSI标准的C程序 -pedantic 允许发出ANSI C标准所列的全部警告信息 -pedantic-error 允许发出ANSI C标准所列的全部错误信息 -w 关闭所有告警 -Wall 允许发出Gcc提供的所有有用的报警信息 -werror 把所有的告警信息转化为错误信息,并在告警发生时终止编译过程 下面结合实例对这几个告警和出错选项进行简单的讲解。 如有以下程序段: #include void main() { long long tmp = 1; printf(“This is a bad code!\n”);

gcc编译器使用说明

要想读懂本文,你需要对C语言有基本的了解,本文将介绍如何使用gcc编译器。首先,我们介绍如何在命令行方式下使用编译器编译简单的C源代码。然后,我们简要介绍一下编译器究竟作了那些工作,以及如何控制编译过程。我们也简要介绍了调试器的使用方法。 GCC rules 你能想象使用封闭源代码的私有编译器编译自由软件吗?你怎么知道编译器在你的可执行文件中加入了什么?可能会加入各种后门和木马。Ken Thompson是一个著名的黑客,他编写了一个编译器,当编译器编译自己时,就在'login'程序中留下后门和永久的木马。请到这里阅读他对这个杰作的描述。幸运的是,我们有了gcc。当你进行 configure; make; make install 时, gcc在幕后做了很多繁重的工作。如何才能让gcc为我们工作呢?我们将开始编写一个纸牌游戏,不过我们只是为了演示编译器的功能,所以尽可能地精简了代码。我们将从头开始一步一步地做,以便理解编译过程,了解为了制作可执行文件需要做些什么,按什么顺序做。我们将看看如何编译C程序,以及如何使用编译选项让gcc按照我们的要求工作。步骤(以及所用工具)如下:预编译 (gcc -E),编译 (gcc),汇编 (as),和连接 (ld)。 开始... 首先,我们应该知道如何调用编译器。实际上,这很简单。我们将从那个著名的第一个C程序开始。(各位老前辈,请原谅我)。 #include int main() { printf("Hello World!\n"); } 把这个文件保存为 game.c。你可以在命令行下编译它: gcc game.c 在默认情况下,C编译器将生成一个名为 a.out 的可执行文件。你可以键入如下命令运行它:a.out Hello World 每一次编译程序时,新的 a.out 将覆盖原来的程序。你无法知道是哪个程序创建了 a.out。

GCC编译器选项及优化提示12页word

GCC编译器选项及优化提示 GCC编译器选项及优化提示2010-08-01 19:41很多弟兄可能都很关心如何优化编译自己的程序,虽然本人不赞成"骨灰"玩法,却也不得不承认这是掌握gcc的绝佳途径; 因此献上此帖,以供各位玩家参考,绝对原创噢 大多数程序和库在编译时默认的优化级别是"2"(使用gcc选项:"-O2")并且在Intel/AMD平台上默认按照i386处理器来编译。 如果你只想让编译出来的程序运行在特定的平台上,就需要执行更高级的编译器优化选项,以产生只能运行于特定平台的代码。 一种方法是修改每个源码包中的Makefile文件,在其中寻找CFLAGS和CXXFLAGS变量(C和C++编译器的编译选项)并修改它的值。 一些源码包比如binutils,gcc,glibc等等,在每个子文件夹中都有Makefile文件,这样修改起来就太累了! 另一种简易做法是设置CFLAGS和CXXFLAGS环境变量。大多数configure脚本会使用这两个环境变量代替Makefile文件中的值。 但是少数configure脚本并不这样做,他们必须需要手动编辑才行。 为了设置CFLAGS和CXXFLAGS环境变量,你可以在bash中执行如下命令(也可以写进.bashrc以成为默认值): export CFLAGS="-O3-march="&&CXXFLAGS=$CFLAGS 这是一个确保能够在几乎所有平台上都能正常工作的最小设置。 "-march"选项表示为特定的cpu类型编译二进制代码(不能在更低级别的cpu上运行), Intel通常是: pentium2,pentium3,pentium3m,pentium4,pentium4m,pentium- m,prescott,nocona 说明:pentium3m/pentium4m是笔记本用的移动P3/P4;pentium-m 是迅驰I/II代笔记本的cpu; prescott是带SSE3的P4(以滚烫到可以煎鸡蛋而闻名);nocona则是最新的带有EMT64(64位)的P4(同样可以煎鸡蛋)

gcc入门教程

不经意间,GCC已发展到了4.3的版本,尽管在软件开发社区之外乏人闻问,但因为GCC 在几乎所有开源软件和自由软件中都会用到,因此它的编译性能的涨落会直接影响到Linux 、Firefox 乃至于https://www.360docs.net/doc/df12290182.html,和Apache等几千个项目的开发。因此,把GCC摆在开源软件的核心地位是一点也不为过。另一方面,GCC4.3的出现,正在牵引着广大程序员们的心。如果我们非要用一个词来说明GCC与程序员之间的关系,那无疑是"心随心动"。 历史篇 作为自由软件的旗舰项目,Richard Stallman 在十多年前刚开始写作GCC 的时候,还只是把它当作仅仅一个 C 程序语言的编译器;GCC 的意思也只是GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持C 语言;它现在还支持Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的Mercury 语言,等等。而GCC 也不再单只是GNU C 语言编译器的意思了,而是变成了GNU Compiler Collection 也即是GNU 编译器家族的意思了。另一方面,说到GCC 对于各种硬件平台的支持,概括起来就是一句话:无所不在。几乎所有有点实际用途的硬件平台,甚至包括有些不那么有实际用途的硬件平台。 Gcc 简介 Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。Gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。 官方网站:https://www.360docs.net/doc/df12290182.html,/ gcc是linux的唯一编译器,没有gcc就没有linux,gcc的重要性就不可言喻啦。居然这么重要,那就很值得我们来好好研究下啦。好啦,开始我们的gcc之旅吧! 首先消除gcc和g++误区吧。 gcc和g++都是GNU(组织)的一个编译器。 误区一:gcc只能编译c代码,g++只能编译c++代码 两者都可以,但是请注意: 1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的,例如:#include int main(int argc, char* argv[]) { if(argv == 0) return; printString(argv); return; } int printString(char* string) { sprintf(string, "This is a test.\n"); } 如果按照C的语法规则,OK,没问题,但是,一旦把后缀改为cpp,立刻报三个错:“printString 未定义”; “cannot convert `char**' to `char*”;

实验二、Vi文本编辑器和GCC编译器的使用

实验二、Vi文本编辑器和GCC编译器的使用 一、实验目的: 1、掌握Linux系统终端方式使用的编辑器vi; 2、学习vi的启动、存盘、文本输入、现有文件的打开、光标移动、复制/剪贴、查找/替换等命令。 3、掌握GCC编译器的使用。 二、实验内容: 1、用Vi文本编辑器对你的计算机进行网络配置。网络配置文件有: 文件1:/etc/sysconfig/network; 文件2:/etc/sysconfig/network-scripts/ifcfg-eth0; 文件3:/etc/resolv.conf; 要求:在图形界面下配置,看相应配置文件有没有被修改;修改配置文件看图形界面是否被修改。 2、将显示器配置文件(自己查),复制到//home目录下(一定要复制,对副本进行操作,否则出现异常后果自负),并重命名为i.打开i文件,设置行标,将第89行至第96行的内容复制到第116行,并将第62行至第86行的Option替换为type.并将整篇文章中的Section替换成choose.将修改后的文件另存为j.并将j复制到/usr目录下,并重命名为k. 3、在vi中编写一个abc.c程序,对程序进行编译、连接、运行。具体如下: [student@enjoy abc]$ vi abc.c main() { int i,sum=0; for(i=0;i<=100;i++) { sum=sum+i; } printf("\n1+2+3+...+99+100=%d\n",sum);}

[student@enjoy abc]$ gcc -o abc abc.c [student@enjoy abc]$ ls abc abc.c [student@enjoy abc]$ ./abc 1+2+3+...+99+100=5050 [student@enjoy abc]$ [student@enjoy abc]$ 4、从如上内容的基础上总结vi的启动、存盘、文本输入、现有文件的打开、光标移动、复制/剪贴、查找/替换等命令。 5、编写一个程序解决“鸡兔同笼”问题。 参考程序: #include main() { int h,f; int x,y; printf("请输入头数和脚数:"); scanf("%d,%d",&h,&f); x=(4*h-f)/2; y=(f-2*h)/2; printf("鸡=%d 兔子=%d",x,y); } 运行结果: 请输入头数和脚数:18,48 鸡=12 兔子=6 注:以上实验结果抓图后,做成电子文档的实验报告发送到ftp://192.168.0.22上。

相关文档
最新文档