gcc手册.docx
- 文档编号:8809037
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:84
- 大小:66.84KB
gcc手册.docx
《gcc手册.docx》由会员分享,可在线阅读,更多相关《gcc手册.docx(84页珍藏版)》请在冰豆网上搜索。
gcc手册
1。
gcc包含的c/c++编译器
gcc,cc,c++,g++,gcc和cc是一样的,c++和g++是一样的,一般c程序就用gcc编译,c++程序就用g++编译
2。
gcc的基本用法
gcctest.c这样将编译出一个名为a.out的程序
gcctest.c-otest这样将编译出一个名为test的程序,-o参数用来指定生成程序的名字
3。
为什么会出现undefinedreferenceto'xxxxx'错误?
首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得不对,你没有指定链接程序要用到得库,比如你的程序里用到了一些数学函数,那么你就要在编译参数里指定程序要链接数学库,方法是在编译命令行里加入-lm。
4。
-l参数和-L参数
-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?
就拿数学库来说,他的库名是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:
cannotfind-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.so.x,/lib/libm.so.6又链接到/lib/libm-2.3.2.so,如果没有这样的链接,还是会出错,因为ld只会找libxxxx.so,所以如果你要用到xxxx库,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个链接就可以了ln-slibxxxx-x.x.x.solibxxxx.so
手工来写链接参数总是很麻烦的,还好很多库开发包提供了生成链接参数的程序,名字一般叫xxxx-config,一般放在/usr/bin目录下,比如gtk1.2的链接参数生成程序是gtk-config,执行gtk-config--libs就能得到以下输出
"-L/usr/lib-L/usr/X11R6/lib-lgtk-lgdk-rdynamic-lgmodule-lglib-ldl-lXi-lXext-lX11-lm",这就是编译一个gtk1.2程序所需的gtk链接参数,xxx-config除了--libs参数外还有一个参数是--cflags用来生成头文件包含目录的,也就是-I参数,在下面我们将会讲到。
你可以试试执行gtk-config--libs--cflags,看看输出结果。
现在的问题就是怎样用这些输出结果了,最笨的方法就是复制粘贴或者照抄,聪明的办法是在编译命令行里加入这个`xxxx-config--libs--cflags`,比如编译一个gtk程序:
gccgtktest.c`gtk-config--libs--cflags`这样就差不多了。
注意`不是单引号,而是1键左边那个键。
除了xxx-config以外,现在新的开发包一般都用pkg-config来生成链接参数,使用方法跟xxx-config类似,但xxx-config是针对特定的开发包,但pkg-config包含很多开发包的链接参数的生成,用pkg-config--list-all命令可以列出所支持的所有开发包,pkg-config的用法就是pkg-configpagName--libs--cflags,其中pagName是包名,是pkg-config--list-all里列出名单中的一个,比如gtk1.2的名字就是gtk+,pkg-configgtk+--libs--cflags的作用跟gtk-config--libs--cflags是一样的。
比如:
gccgtktest.c`pkg-configgtk+--libs--cflags`。
5。
-include和-I参数
-include用来包含头文件,但一般情况下包含头文件都在源码里用#includexxxxxx实现,-include参数很少用。
-I参数是用来指定头文件目录,/usr/include目录一般是不用指定的,gcc知道去那里找,但是如果头文件不在/usr/include里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上-I/myinclude参数了,如果不加你会得到一个"xxxx.h:
Nosuchfileordirectory"的错误。
-I参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定。
上面我们提到的--cflags参数就是用来生成-I参数的。
6。
-O参数
这是一个程序优化参数,一般用-O2就是,用来优化程序用的,比如gcctest.c-O2,优化得到的程序比没优化的要小,执行速度可能也有所提高(我没有测试过)。
7。
-shared参数
编译动态库时要用到,比如gcc-sharedtest.c-olibtest.so
8。
几个相关的环境变量
PKG_CONFIG_PATH:
用来指定pkg-config用到的pc文件的路径,默认是/usr/lib/pkgconfig,pc文件是文本文件,扩展名是.pc,里面定义开发包的安装路径,Libs参数和Cflags参数等等。
CC:
用来指定c编译器。
CXX:
用来指定cxx编译器。
LIBS:
跟上面的--libs作用差不多。
CFLAGS:
跟上面的--cflags作用差不多。
CC,CXX,LIBS,CFLAGS手动编译时一般用不上,在做configure时有时用到,一般情况下不用管。
环境变量设定方法:
exportENV_NAME=xxxxxxxxxxxxxxxxx
9。
关于交叉编译
交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上,比如在我们地PC平台(X86CPU)上编译出能运行在sparcCPU平台上的程序,编译得到的程序在X86CPU平台上是不能运行的,必须放到sparcCPU平台上才能运行。
当然两个平台用的都是linux。
这种方法在异平台移植和嵌入式开发时用得非常普遍。
相对与交叉编译,我们平常做的编译就叫本地编译,也就是在当前平台编译,编译得到的程序也是在本地执行。
用来编译这种程序的编译器就叫交叉编译器,相对来说,用来做本地编译的就叫本地编译器,一般用的都是gcc,但这种gcc跟本地的gcc编译器是不一样的,需要在编译gcc时用特定的configure参数才能得到支持交叉编译的gcc。
为了不跟本地编译器混淆,交叉编译器的名字一般都有前缀,比如sparc-xxxx-linux-gnu-gcc,sparc-xxxx-linux-gnu-g++等等
10。
交叉编译器的使用方法
使用方法跟本地的gcc差不多,但有一点特殊的是:
必须用-L和-I参数指定编译器用sparc系统的库和头文件,不能用本地(X86)的库(头文件有时可以用本地的)。
例子:
sparc-xxxx-linux-gnu-gcctest.c-L/path/to/sparcLib-I/path/to/sparcInclude
gccandg++分别是gnu的c&c++编译器gcc/g++在执行编译工作的时候,总共需要4步
1.预处理,生成.i的文件[预处理器cpp]
2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]
3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]
4.连接目标代码,生成可执行程序[链接器ld]
[参数详解]
-xlanguagefilename
设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后缀名称是.c的,而C++的后缀名是.C或者.cpp,如果你很个性,决定你的C代码文件的后缀名是.pig哈哈,那你就要用这个参数,这个参数对他后面的文件名都起作用,除非到了下一个参数的使用。
可以使用的参数吗有下面的这些
`c',`objective-c',`c-header',`c++',`cpp-output',`assembler',and`assembler-with-cpp'.
看到英文,应该可以理解的。
例子用法:
gcc-xchello.pig-xnonefilename
关掉上一个选项,也就是让gcc根据文件名后缀,自动识别文件类型
例子用法:
gcc-xchello.pig-xnonehello2.c
-c
只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
例子用法:
gcc-chello.c
他将生成.o的obj文件
-S
只激活预处理和编译,就是指把文件编译成为汇编代码。
例子用法
gcc-Shello.c
他将生成.s的汇编代码,你可以用文本编辑器察看
-E
只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面.
例子用法:
gcc-Ehello.c>pianoapan.txt
gcc-Ehello.c|more
慢慢看吧,一个helloword也要与处理成800行的代码
-o
制定目标名称,缺省的时候,gcc编译出来的文件是a.out,很难听
例子用法
gcc-ohello.exehello.c(哦,windows用习惯了)
gcc-ohello.asm-Shello.c
-pipe
使用管道代替编译中临时文件,在使用非gnu汇编工具的时候,可能有些问题
gcc-pipe-ohello.exehello.c
-ansi
关闭gnuc中与ansic不兼容的特性,激活ansic的专有特性(包括禁止一些asminlinetypeof关键字,以及UNIX,vax等预处理宏,
-fno-asm
此选项实现ansi选项的功能的一部分,它禁止将asm,inline和typeof用作关键字。
-fno-strict-prototype
只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式的对参数
的个数和类型说明,而不是没有参数.
而gcc无论是否使用这个参数,都将对没有带参数的函数,认为城没有显式说明的类型
-fthis-is-varialble
就是向传统c++看齐,可以使用this当一般变量使用.
-fcond-mismatch
允许条件表达式的第二和第三参数类型不匹配,表达式的值将为void类型
-funsigned-char
-fno-signed-char
-fsigned-char
-fno-unsigned-char
这四个参数是对char类型进行设置,决定将char类型设置成unsignedchar(前两个参
数)或者signedchar(后两个参数)
-includefile
包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以用它设
定,功能就相当于在代码中使用#include
例子用法:
gcchello.c-include/root/pianopan.h
-imacrosfile
将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件中
-Dmacro
相当于C语言中的#definemacro
-Dmacro=defn
相当于C语言中的#definemacro=defn
-Umacro
相当于C语言中的#undefmacro
-undef
取消对任何非标准宏的定义
-Idir
在你是用#include"file"的时候,gcc/g++会先在当前目录查找你所制定的头文件,如
果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他回先在你所制定的目录查找,然后再按常规的顺序去找.
对于#include
-I-
就是取消前一个参数的功能,所以一般在-Idir之后使用
-idirafterdir
在-I的目录里面查找失败,讲到这个目录里面查找.
-iprefixprefix
-iwithprefixdir
一般一起使用,当-I的目录查找失败,会到prefix+dir下查找
-nostdinc
使编译器不再系统缺省的头文件目录里面找头文件,一般和-I联合使用,明确限定头
文件的位置
-nostdinC++
规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创libg++库使用
-C
在预处理的时候,不删除注释信息,一般和-E使用,有时候分析程序,用这个很方便的
-M
生成文件关联的信息。
包含目标文件所依赖的所有源代码你可以用gcc-Mhello.c
来测试一下,很简单。
-MM
和上面的那个一样,但是它将忽略由#include
-MD
和-M相同,但是输出将导入到.d的文件里面
-MMD
和-MM相同,但是输出将导入到.d的文件里面
-Wa,option
此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选项,然后传递给会汇编程序
-Wl.option
此选项传递option给连接程序;如果option中间有逗号,就将option分成多个选项,然后传递给会连接程序.
-llibrary
制定编译的时候使用的库
例子用法
gcc-lcurseshello.c
使用ncurses库编译程序
-Ldir
制定编译的时候,搜索库的路径。
比如你自己的库,可以用它制定目录,不然
编译器将只在标准库的目录找。
这个dir就是目录的名称。
-O0
-O1
-O2
-O3
编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-g
只是编译器,在编译的时候,产生调试信息。
-gstabs
此选项以stabs格式声称调试信息,但是不包括gdb调试信息.
-gstabs+
此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息.
-ggdb
此选项将尽可能的生成gdb的可以使用的调试信息.
-static
此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么
动态连接库,就可以运行.
-share
此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
-traditional
试图让编译器支持传统的C语言特性
-Gccmanpage
[ChangeLog]
-2002-08-10
ver0.1发布最初的文档
-2002-08-11
ver0.11修改文档格式
-2002-08-12
ver0.12加入了对静态库,动态库的参数
-2002-08-16
ver0.16增加了gcc编译的4个阶段的命令
运行gcc/egcs
**********运行gcc/egcs***********************
GCC是GNU的C和C++编译器。
实际上,GCC能够编译三种语言:
C、C++和O
bjectC(C语言的一种面向对象扩展)。
利用gcc命令可同时编译并连接C和C++
源程序。
如果你有两个或少数几个C源文件,也可以方便地利用GCC编译、连接并生成可
执行文件。
例如,假设你有两个源文件main.c和factorial.c两个源文件,现在要编
译生成一个计算阶乘的程序。
代码:
-----------------------
清单factorial.c
-----------------------
intfactorial(intn)
{
if(n<=1)
return1;
else
returnfactorial(n-1)*n;
}
-----------------------
清单main.c
-----------------------
#include
#include
intfactorial(intn);
intmain(intargc,char**argv)
{
intn;
if(argc<2)
{
printf("Usage:
%sn\n",argv[0]);
return-1;
}
else
{
n=atoi(argv[1]);
printf("Factorialof%dis%d.\n",n,factorial(n));
}
return0;
}
-----------------------
利用如下的命令可编译生成可执行文件,并执行程序:
$gcc-ofactorialmain.cfactorial.c
$./factorial5
Factorialof5is120.
GCC可同时用来编译C程序和C++程序。
一般来说,C编译器通过源文件的后缀名来判断是C程序还是C++程序。
在Linux中,C源文件的后缀名为.c,而C++源文件的后缀名为.C或.cpp。
但是,gcc命令只能编译C++源文件,而不能自动和C++程序使用的库连接。
因此,通常使用g++命令来完成C++程序的编译和连接,该程序会自动调用gcc实现编译。
假设我们有一个如下的C++源文件(hello.C):
#include
voidmain(void)
{
cout<<"Hello,world!
"< } 则可以如下调用g++命令编译、连接并生成可执行文件: $g++-ohellohello.C $./hello Hello,world! **********************gcc/egcs的主要选项********* gcc命令的常用选项 选项解释 -ansi只支持ANSI标准的C语法。 这一选项将禁止GNUC的某些特色, 例如asm或typeof关键词。 -c只编译并生成目标文件。 -DMACRO以字符串“1”定义MACRO宏。 -DMACRO=DEFN以字符串“DEFN”定义MACRO宏。 -E只运行C预编译器。 -g生成调试信息。 GNU调试器可利用该信息。 -IDIRECTORY指定额外的头文件搜索路径DIRECTORY。 -LDIRECTORY指定额外的函数库搜索路径DIRECTORY。 -lLIBRARY连接时搜索指定的函数库LIBRARY。 -m486针对486进行代码优化。 -oFILE生成指定的输出文件。 用在生成可执行文件时。 -O0不进行优化处理。 -O或-O1优化生成代码。 -O2进一步优化。 -O3比-O2更进一步优化,包括inline函数。 -shared生成共享目标文件。 通常用在建立共享库时。 -static禁止使用共享连接。 -UMACRO取消对MACRO宏的定义。 -w不生成任何警告信息。 -Wall生成所有警告信息。 GCCSection: GNUTools (1)Updated: 2003/12/05 IndexReturntoMainContents NAME gcc,g++-GNU工程的C和C++编译器(egcs-1.1.2) 总览(SYNOPSIS) gcc[option|filename]... g++[option|filename]... 警告(WARNING) 本手册页内容摘自GNUC编译器的完整文档,仅限于解释选项的含义. 除非有人自愿维护,否则本手册页不再更新.如果发现手册页和软件之间有所矛盾,请查对Info文件,Info文件是权威文档.如果我们发觉本手册页的内容由于过时而导致明显的混乱和抱怨时,我们就停止发布它.不可能有其他选择,象更新Info文件同时更新man手册,因为其他维护GNUCC的工作没有留给我们时间做这个.GNU工程认为man手册是过时产物,应该把时间用到别的地方.如果需要完整和最新的文档,请查阅Info文件`gcc'或UsingandPortingGNUCC(forversion2.0)(使用和移植GNUCC2.0)手册.二者均来自Texinfo原文件gcctexinfo. 描述(DESCRIPTION) C和C++编译器是集成的.他们都要用四个步骤中的一个或多个处理输入文件: 预处理(preprocessing),编译(compilation),汇编(assembly)和连接(linking).源文件后缀名标识源文件的语言
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- gcc 手册