一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2158|回复: 0
收起左侧

GCC 参数

[复制链接]
发表于 2017-1-13 17:21 | 显示全部楼层 |阅读模式
[介绍] $ }/ `. a" E/ j+ E
gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 6 o. T2 Y, L( W2 C7 r! b, h
) R& X7 S" I) h. ^) K$ }1 A% v
1.预处理,生成.i的文件[预处理器cpp] # g  q) A) E- n2 ~
2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs] $ J9 n& L9 B* K  t9 z6 M5 I% [
3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as] 2 P" `4 k$ W# A
4.连接目标代码,生成可执行程序[链接器ld]
6 `% P5 [+ n  I3 @[参数详解]
4 O" F- p' S/ e% I" L# ^-x language filename , @# K1 F9 T0 F6 J! z  E& I. N
  设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后
" B  m* [0 T* _7 {: q缀名称是.c的,而C++的后缀名是.C或者.cpp,如果你很个性,决定你的C代码文件的后缀
/ w+ o9 v3 w# e/ T名是.pig 哈哈,那你就要用这个参数,这个参数对他后面的文件名都起作用,除非到了 3 U, L- _  Q. K' s  l
下一个参数的使用。 - ]& f+ G3 u1 {" \) U1 e
  可以使用的参数吗有下面的这些 / E' V0 Q8 y2 g" t; n7 a& K
  `c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `a $ Q0 V( ~( j+ l2 S
ssembler-with-cpp'.
9 A7 a- M! z# w5 ?% e9 V  看到英文,应该可以理解的。 ' S$ W7 q" `3 L" e: E+ d/ ?! v
  例子用法: 8 }" ?5 B. g# ?/ _  X. l
  gcc -x c hello.pig 1 l# m4 S/ N& h2 m
  
4 f8 B, f0 t+ ]* n& f/ z-x none filename 3 h! `. a. B6 O8 U- o6 n
  关掉上一个选项,也就是让gcc根据文件名后缀,自动识别文件类型
0 \% K2 H7 p  j- A' D3 j* B! K  例子用法:
8 L  ?/ `- B1 [' C- z$ ^: \2 A) h  gcc -x c hello.pig -x none hello2.c   e) K. c( I8 {: a, J/ e
  
! V! F9 a* j% W; ~/ N" f9 x" K-c
1 L! H6 j2 k7 G9 f  只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
" ?# L2 _: ^# \1 D0 K. q1 t9 K) e3 f  例子用法: $ }3 n, r# ?( B
  gcc -c hello.c   ?( R+ D# H! j
  他将生成.o的obj文件 . R7 r& d4 Y1 a% {+ i; |
-S
$ S2 ?) Z5 D9 v+ k" ^& u  只激活预处理和编译,就是指把文件编译成为汇编代码。
# q* T$ z% e9 K% S  例子用法 : r/ G; p7 r- U* t7 ~: k5 D
  gcc -S hello.c
9 Z$ l, ]# h/ W+ x/ ^' \  他将生成.s的汇编代码,你可以用文本编辑器察看   x& v" e" S( W3 _. i4 i
-E 7 ]4 u; x* X$ q0 P( T
  只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面. " V( t' E3 E. H, _/ U8 g* n$ b
  例子用法: & P4 I/ u7 h3 c: {1 w5 R$ l1 ~
  gcc -E hello.c > pianoapan.txt . o4 p' F3 t: N/ y: n) V
  gcc -E hello.c | more 9 j3 a1 O' Q# A) ?7 N
  慢慢看吧,一个hello word 也要与处理成800行的代码 # B8 U& w4 }/ Z" Z
-o 8 o- `. t9 L5 A5 v, O4 g$ ?/ B4 j
  制定目标名称,缺省的时候,gcc 编译出来的文件是a.out,很难听,如果你和我有同感
. J5 U2 Y; {! O) F/ J5 U) g,改掉它,哈哈 + t" k7 x2 F/ }! e+ E8 B
  例子用法
% D4 m) n4 X/ e! [# P  gcc -o hello.exe hello.c (哦,windows用习惯了) 3 b+ n0 \- A: q& X
  gcc -o hello.asm -S hello.c
+ d. }% C  G7 K) S/ b-pipe
: s2 B* U- {& h7 |  使用管道代替编译中临时文件,在使用非gnu汇编工具的时候,可能有些问题
) s/ V7 q% I5 M: |& t* ~0 q- [  gcc -pipe -o hello.exe hello.c
5 @. k: P8 a9 S9 s-ansi $ T, J$ ~/ e" b
  关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性(包括禁止一些asm inl
( Q1 Y5 d. A1 zine typeof关键字,以及UNIX,vax等预处理宏, 2 m1 {4 S1 Z+ ~! v4 n
-fno-asm
( K- N. U& t" ^2 `$ p, Y, S  此选项实现ansi选项的功能的一部分,它禁止将asm,inline和typeof用作关键字。
: j# T: q( @6 H% t( t3 G( }5 L     4 p. L4 D! K) a4 j5 a5 x
-fno-strict-prototype
# [" v. T. W' R% n  只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式的对参数 * o1 ^3 i1 `0 \# R, w; D8 [
的个数和类型说明,而不是没有参数.
4 W- v$ {4 v) f& V  而gcc无论是否使用这个参数,都将对没有带参数的函数,认为城没有显式说明的类型
6 n+ z' l2 ~; s! W
  l: L* T! f, }  
7 j4 X) g: G! h. o' B-fthis-is-varialble
# ?- f0 g8 j; ~! _7 S  就是向传统c++看齐,可以使用this当一般变量使用. ! ~, {; r2 i2 V+ @, W2 o
  
  x' P* `% R+ O6 [-fcond-mismatch # A: z  B% ~% j, W/ m! U: g$ M
  允许条件表达式的第二和第三参数类型不匹配,表达式的值将为void类型
4 W4 F1 p# o0 w$ L& l   $ d+ V; @! r# R  f! J9 L
-funsigned-char
" m0 K% {+ _; B$ f% x' j8 L; K-fno-signed-char # H# F1 V' {1 a9 h8 a( e7 g
-fsigned-char " @/ U2 ]% |' g8 @. P! Z# D! M
-fno-unsigned-char , C7 K. @# F* u6 B$ d* h( M0 h2 S
  这四个参数是对char类型进行设置,决定将char类型设置成unsigned char(前两个参
+ |7 s7 `/ ^% |7 F2 }数)或者 signed char(后两个参数) . X" z$ J5 L9 J# B5 K0 s; Z
   ! m$ @9 J$ {" ?/ G$ G7 C
-include file ( F  z1 l6 p6 ~( g0 _1 m  l% D' y
  包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以用它设
6 C$ Z) W. r' A% U$ K7 T  {2 D4 e定,功能就相当于在代码中使用#include<filename>
0 d) V; o* f8 F  n% \1 Q/ x2 S1 R3 P, i  例子用法:
- U% |' a! h5 |  gcc hello.c -include /root/pianopan.h % ?2 ~- B6 E$ i7 J
  
- w" f) y! m4 n# Q$ A-imacros file
: K7 e* ]6 _* \0 [1 j  将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件中
2 O" S8 m- x& G9 k1 A; m   2 X: t& `# m' Y- `2 J0 J( h
-Dmacro
6 y7 {; T: s7 ?: i* n  相当于C语言中的#define macro + t' b$ b  F! W9 `9 v  X
  
- \! R* D0 ~2 l9 ], h-Dmacro=defn . A( {* w- o6 V
  相当于C语言中的#define macro=defn 6 S- u' ?4 D6 q
  
  r8 H" G2 n; i9 V3 D; P4 [-Umacro - p. G- Z5 u: l7 s& R
  相当于C语言中的#undef macro
* ?3 E. I$ ?, Y) m- M* F-undef
1 T8 r) Q" u7 X! V  取消对任何非标准宏的定义
, J/ g% p8 A1 S  
  \# o& R9 _3 ?" h  X" V* l-Idir 5 Q2 Z5 U  n- E% c6 c
  在你是用#include"file"的时候,gcc/g++会先在当前目录查找你所制定的头文件,如 7 w7 F3 k1 ^4 B' Q9 Z2 m
果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他
$ n7 j! a( A2 o& |4 M; U  回先在你所制定的目录查找,然后再按常规的顺序去找.
& t6 T+ a. S% w) A  对于#include<file>,gcc/g++会到-I制定的目录查找,查找不到,然后将到系统的缺 9 i, j8 Q& a, P0 Z$ R9 d6 O# o
省的头文件目录查找 7 A) }" p% G0 I2 d
  
. h& O& f. m5 ]8 u8 @7 u-I-
3 S4 ^9 H9 F) M/ f. |  就是取消前一个参数的功能,所以一般在-Idir之后使用
, ~  N! A2 y$ W% t0 d   / t2 L4 @$ f% e9 a, e3 n, L: j. P
-idirafter dir
- |* \- \, D7 ?/ q  在-I的目录里面查找失败,讲到这个目录里面查找. 7 ^8 @) D% k0 q1 Q
   0 p4 S8 o- M& U; c! Q
-iprefix prefix
) k9 C- T1 q0 e2 _% G, v-iwithprefix dir 6 r" w7 ~. `. [" ^0 C
  一般一起使用,当-I的目录查找失败,会到prefix+dir下查找
# }& Q0 @& n0 T* r" X- t   5 N% U4 N; l& T8 g" r( t* N
-nostdinc
1 H) Z7 H$ v. u: F' V, j& }  d  使编译器不再系统缺省的头文件目录里面找头文件,一般和-I联合使用,明确限定头 1 W) l1 x# k) O0 g
文件的位置 . G& ~/ B6 ~+ L2 }
  
. v$ ]! O5 C; W! A: w-nostdin C++ ; ]. a" m- T6 s% f  _7 y5 \
  规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创libg++库
5 q& ~0 U; ]7 ~$ o3 O& a使用 1 F, u; T  N% r) q
   3 x! i6 s9 }' K4 |4 |. D
-C
: _, T: v  D& G" w  在预处理的时候,不删除注释信息,一般和-E使用,有时候分析程序,用这个很方便的
/ e/ ]0 K/ Z# i( P7 I. ]6 M8 g: ^9 a7 h9 M( R1 U
   9 Z0 F9 t3 x3 D2 y) c6 I
-M
) Q4 ^* A% F: F5 T% B0 Z  生成文件关联的信息。包含目标文件所依赖的所有源代码你可以用gcc -M hello.c
& Z+ c3 [& I5 y. B: P来测试一下,很简单。
; I. |% Q) o  ~- m   " {) L4 F2 R$ X" K, E
-MM
- ]8 Z9 o0 K2 O& p4 b  和上面的那个一样,但是它将忽略由#include<file>造成的依赖关系。
% ^1 m* q+ Z3 ~. ?  ~7 j  
5 E; x  _8 C% K4 y0 I6 }8 Y" U6 I& V-MD
# s7 o& l; }1 g  和-M相同,但是输出将导入到.d的文件里面 ; ~- J9 D( z1 d: Z
   5 `. X. F% |8 Z
-MMD : M) u8 k; Y; C  t6 ]. ^: b4 Z
  和-MM相同,但是输出将导入到.d的文件里面
# v$ }2 B' {! t! G8 m! i: h  
$ c" w2 M) ?2 x1 {8 _-Wa,option
& }+ @6 }/ {# v1 c  L# }  此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选项,然
1 a* Q4 ^/ G9 \) u2 T后传递给会汇编程序
  ?0 D4 ^5 ]7 Z   5 H' Y/ c7 y8 Q. L; D
-Wl.option
5 ]0 }; [9 X3 C  i# Q6 q  此选项传递option给连接程序;如果option中间有逗号,就将option分成多个选项,然 , s9 k; S4 e. ~9 Z5 v$ [& `2 F, d
后传递给会连接程序.
: }9 |, E( z- G. Y$ n  
- C4 |1 C9 _& E! F$ s-llibrary
2 M6 \' s5 z  s' W  制定编译的时候使用的库 & w% S0 m! \" D) r1 D5 Y
  例子用法 + X  o) d. |. A) T) g; e
  gcc -lcurses hello.c 9 O( X- B5 S9 u, B8 @, I2 y
  使用ncurses库编译程序
6 a' ^; ?, I5 ]1 L/ y  _% z; ?& W  
- W+ T3 Y5 W3 t* n: @) b-Ldir
( H1 t6 {3 M' B. X  制定编译的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然
+ w4 g4 R" j0 n# P  编译器将只在标准库的目录找。这个dir就是目录的名称。
6 H* u- [/ b" o: L. z   ; e9 Q9 L, ^+ a$ ~- p
-O0 * V; k$ y& s: ~
-O1
. `7 u) i0 l, P  v7 k-O2
4 V' m  {8 ~! e8 m4 e3 A-O3
4 v& e5 x. ~3 y2 k4 |) J* U  编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高 
! G; U2 Y0 U2 E6 {0 V     ( p4 f; P: K( ^
-g ! q0 Y/ B7 W$ T3 Z  n  {0 Q8 \
  只是编译器,在编译的时候,产生调试信息。
. Y. o, j3 x4 Q( R  
8 ?9 s* i7 y8 m8 k-gstabs 3 U& o( |$ n$ P0 |' X* W7 I' l
  此选项以stabs格式声称调试信息,但是不包括gdb调试信息.
: B6 l# C! ]  g- P) c- b2 B! U/ v   , b. G! m  N6 J# D; _- _
-gstabs+ 8 ?  }! N1 M- M$ i) T* t; s
  此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息.   l* v: m2 x3 p" H5 h  e. N
  
! w1 o" [0 U$ P$ p-ggdb
, U, O: O0 i9 Q8 \% }" \) w  此选项将尽可能的生成gdb的可以使用的调试信息. 4 B0 ^4 I+ s: H2 [
-static
% p3 M2 e. I; O6 K" {6 `2 E  此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么
: [3 o" l* k0 m, k  R动态连接库,就可以运行. 9 q8 r1 ^* P- r% C
-share   x2 E5 [6 N3 }; Y* U' z
  此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.   _7 }% a8 U7 X6 p- G1 `
-traditional
0 [- k/ Q+ I( k  试图让编译器支持传统的C语言特性 . d9 ]1 s; h8 q0 B! f
[参考资料] / \; A/ T0 O8 X
-Linux/UNIX高级编程
& i) A7 i; w( f  中科红旗软件技术有限公司编著.清华大学出版社出版
& {$ M8 v3 I8 j$ D3 Q-Gcc man page
" |; ^. m2 i: I9 B. \4 r% Y! t  
7 U/ f. o9 q  G% t4 f[ChangeLog] 4 N! o6 j0 S# J
-2002-08-10 & I) c6 G$ W/ Y1 L# V! F2 @# Z
  ver 0.1 发布最初的文档 4 N$ A; `1 C4 ^+ k1 _
-2002-08-11 5 q: R& e+ G( ~4 u, x3 `
  ver 0.11 修改文档格式 . w) x' P/ C5 f7 c  \
-2002-08-12
. {3 q, @; a3 a3 t  ver 0.12 加入了对静态库,动态库的参数 6 D- Y) W7 B: i8 v* f
-2002-08-16
- `4 S9 U7 y9 V6 D  ver 0.16 增加了gcc编译的4个阶段的命令 8 v2 P" F2 ~! {1 m( @  ~
运行 gcc/egcs
5 c) }! E$ s5 u9 O+ w$ M9 a**********运行 gcc/egcs*********************** ! A$ L9 T: W6 X/ W
  GCC 是 GNU 的 C 和 C++ 编译器。实际上,GCC 能够编译三种语言:C、C++ 和 O
% I& m$ g/ o5 n- Q$ x5 h8 Xbject C(C 语言的一种面向对象扩展)。利用 gcc 命令可同时编译并连接 C 和 C++
( p/ O& \( F7 W: a) ~源程序
- P: H' b* M- H  如果你有两个或少数几个 C 源文件,也可以方便地利用 GCC 编译、连接并生成可
, m- k4 k& b$ D$ g0 |执行文件。例如,假设你有两个源文件 main.c 和 factorial.c 两个源文件,现在要编 ; b$ b4 A7 X  F" n" y
译生成一个计算阶乘的程序。
3 }: n! G. K& j" p8 @* b$ m代码:
2 ^! c$ c- d2 k' M, R3 W2 Y-----------------------
( M( i% M  c/ h: \* ?; G3 ?清单 factorial.c
  ~/ H8 R5 ^/ e( {7 E-----------------------
6 q% Z6 w( C# Aint factorial (int n) " H& b+ z1 T/ |1 B
{ + H0 [3 A6 |0 {3 _& U5 e8 A; A
  if (n <= 1)
$ M7 L" Z+ X" X8 K9 m   return 1;
! ?' J* e5 T2 b! B1 `3 s9 a  else
. @' a! G/ f$ b8 A$ z/ {$ ^4 }8 u+ t   return factorial (n - 1) * n; 3 M- m* T" c/ B/ Q7 O5 Z. d
} & n* S. X, W( W: G# L& u
----------------------- + F4 d% k; i0 g+ f$ L
清单 main.c . }% g2 k: E: x; p' {
----------------------- * a0 b9 d# `. f+ d6 Z$ k
#include <stdio.h> ) S$ F, i, I' R& @8 K. ]) ]# I
#include <unistd.h>
" S) F: T, O( K& t- p" z+ ]int factorial (int n); $ O# `9 D/ A3 D& d
int main (int argc, char **argv) 3 T$ `2 |( x/ s7 C; c; i  u2 f
{ * a& J1 M: S0 }! a/ O" l4 u( g
  int n;
* {% y! O5 `' A# y7 _  if (argc < 2) 7 W' x5 X8 C2 D% Q: H/ r
  {
2 n" I) x5 P& F    printf ("Usage: %s n\n", argv [0]);
" a5 h8 S/ _% H3 Z8 L1 H    return -1; ' R* W0 D) E' s# K) [, W
  }
  f) o" E& v5 f# A  else
+ v3 B+ _6 H( b& b& F# k  o1 m4 T  { 1 ^4 p7 O$ B% G) H
   n = atoi (argv[1]);
, E; q0 y) g' z  X$ d* ~   printf ("Factorial of %d is %d.\n", n, factorial (n)); 7 {% d$ V. ^# s
   } 7 ^3 x' D& ^3 k4 a4 A9 c' I- k
  return 0; 2 Z2 h7 l$ Z- E! y, u
}
6 `6 v  o2 G1 L! K0 |4 ~7 n$ a----------------------- ) t* }7 r& d9 [: b5 Y
利用如下的命令可编译生成可执行文件,并执行程序:
3 s9 Z9 g; c, q0 O$ gcc -o factorial main.c factorial.c
6 ^9 u, O1 D4 K$ ./factorial 5
1 a6 j$ g7 d9 o' L/ u8 r5 t, oFactorial of 5 is 120. 4 u" c0 \/ D, W0 V
  GCC 可同时用来编译 C 程序和 C++ 程序。一般来说,C 编译器通过源文件的后缀 3 f- ]6 j" h7 c
名来判断是 C 程序还是 C++ 程序。在 Linux 中,C 源文件的后缀名为 .c,而 C++ 源 & x- n& x; t8 t# a0 o
文件的后缀名为 .C 或 .cpp。但是,gcc 命令只能编译 C++ 源文件,而不能自动和 C
! _$ j5 z9 o, l++ 程序使用的库连接。因此,通常使用 g++ 命令来完成 C++ 程序的编译和连接,该程 9 k  P8 e" J# f6 g7 n1 ~
序会自动调用 gcc 实现编译。假设我们有一个如下的 C++ 源文件(hello.C): + V$ }9 h# J3 h/ ^: C
#include <iostream> 8 ^  ^6 g% m9 t9 R
void main (void)
2 P* A2 A- v: }1 p{ . m7 {; f  ?; W  H. D
  cout << "Hello, world!" << endl;
- U- W( r8 X% l, b+ z# \* v} 7 v# K) ]4 e7 F/ t" b/ h- F
则可以如下调用 g++ 命令编译、连接并生成可执行文件: + u& U8 L, \9 o! @  K
$ g++ -o hello hello.C , O- h2 F# ?( I$ o
$ ./hello
; g' G" \4 ~' L& UHello, world! 0 P7 r4 X9 t! B" [
**********************gcc/egcs 的主要选项********* ' m# b2 x$ N8 j# n8 v7 d% Q. F
gcc 命令的常用选项
/ s6 p! b' u4 \  N1 `2 V选项 解释 + m; ~# |0 o- L8 x' \
-ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色, 6 Y0 d; T4 p' @( r$ n
例如 asm 或 typeof 关键词。
8 A) V0 S/ V" ~/ M# b-c 只编译并生成目标文件。
- Q. d7 y6 q! K* d" |3 x8 `7 s-DMACRO 以字符串“1”定义 MACRO 宏。 , H/ U9 Y* n( L0 R: Y1 O. T+ O# [
-DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。 + J7 |( M9 D! N! N1 ?% L7 E& H
-E 只运行 C 预编译器。 - j1 }. u8 f: `: r; j
-g 生成调试信息。GNU 调试器可利用该信息。 2 W: `- w* }6 E  L8 {9 P
-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。 8 {' ]( F' a% K( `1 P/ a5 N. y: ]
-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。
& |7 K! B, g8 K3 k! T- B0 I4 U# [-lLIBRARY 连接时搜索指定的函数库LIBRARY。 ) R8 [3 e; m( o3 x/ w9 B6 m  E+ y
-m486 针对 486 进行代码优化。 9 Z9 Y2 T5 O& h  w
-o FILE 生成指定的输出文件。用在生成可执行文件时。
3 t8 ]  M& T1 e* H) F-O0 不进行优化处理。 3 L( O: y0 j" p$ P* e
-O 或 -O1 优化生成代码。 # q/ @! B/ m. |; y* ~: t
-O2 进一步优化。 / g- y( h* E. H
-O3 比 -O2 更进一步优化,包括 inline 函数。
9 i/ O; M( ^8 k- V: Z6 n-shared 生成共享目标文件。通常用在建立共享库时。
1 c( N1 i' K8 Y; N, m-static 禁止使用共享连接。
$ w5 V# l7 T0 B4 M4 a-UMACRO 取消对 MACRO 宏的定义。
( ]; Y$ `' J. ^7 B" ]+ w0 A-w 不生成任何警告信息。 2 o! d6 t5 y# N4 d; g0 y" k4 H2 a' [
-Wall 生成所有警告信息。# Z1 Y& G3 n5 c  y. {

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-2 07:59 , Processed in 0.080015 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表