LINUX下C的编译
LINUX下C的编译 )32&!^u L<CZo5O. 一.运行 gcc/egcs -x<Hp^=` Linux 中最重要的软件开发工具是 GCC。GCC 是 GNU 的 C 和 C++ 编译器。实际上,GCC能够编译三种语言:C、C++和ObjectC(C语言的一种面向对象扩展)。利用 gcc 命令可同时编译并连接 C 和 C++ 源程序。 TsO^ "W Cxi
"[m #DEMO#: hello.c VAlvQkB4} `F~+]E-l 如果你有两个或少数几个C源文件,也可以方便地利用GCC编译、连接并生成可执行文件。例如,假设你有两个源文件 main.c 和 factorial.c 两个源文件,现在要编译生成一个计算阶乘的程序。 cRNq0g (cQpKc% 清单 factorial.c 6Uj\SZ ----------------------- ,C
e$@]]u #include <lN*xo
0 #include vziZ0'Tg} Ts<.4cjfH2 int factorial (int n) ^ZYmK}RI}w { bT4s?ta if (n <= 1) x6C-4s=P return 1; n+a&izW, =@ I'l else Qc9 #nIF return factorial (n - 1) * n; C__Ha^p;YO } hU8T| ut! ----------------------- =_W=kmN, A@c,B{Oz, # !<TzWc (8K<f[ u #?O/6S? d2;jCM.r ----------------------- g|lt\yI 清单 main.c bRX3zrNU ----------------------- b.1v9V #include 9<gk^%Uy #include ,|t
t] {Mt][(0: int factorial (int n); O
( {)HT> F/I
F}Jb int main (int argc, char **argv) [oM76. zv { Y_@KL +EZ] int n; AqK<WW+a h]H=7p if (argc < 2) { {7; dE5/ printf ("Usage: %s n ", argv [0]); *I7B}\3 return -1; BmbPq } kF{ClB;c else { nDn;bg&>7, n = atoi (argv[1]); m^
+2J<}go printf ("Factorial of %d is %d. ", n, factorial (n)); wdB|e*P*h } 2[K&bK7 c[TmY> U return 0; =; #&H6y[) } 6XXA!> .p ----------------------- !7>4oc; Hiia8oK w.+@Pa]0$ 5o;d-<-/ c}](1dtH[ g\&wqi=- 利用如下的命令可编译生成可执行文件,并执行程序: Zxrc9obG fiM3<kCf $ gcc -o factorial main.c factorial.c Wk-~n%B W# sb M$_)5n $ ./factorial 5 -SF >7pm /adJ|mhgy Factorial of 5 is 120. '9ufyEV8' 5$![L2/ GCC 可同时用来编译 C 程序和 C++ 程序。一般来说,C 编译器通过源文件的后缀名来判断是 C 程序还是 C++ 程序。在 linux 中,C 源文件的后缀名为 .c,而 C++ 源文件的后缀名为 .C 或 .cpp。 )!`#['Nc 2KDIFl1k' 但是,gcc 命令只能编译 C++ 源文件,而不能自动和 C++ 程序使用的库连接。因此,通常使用 g++ 命令来完成 C++ 程序的编译和连接,该程序会自动调用 gcc 实现编译。 '^h#PK[qI g<Nw!9h {y4c
OGb 假设我们有一个如下的 C++ 源文件(hello.C): ej+FjA%AX :KgR"a3{ #include b:*O`q'y _&yLsn void main (void) #Evg*S[ { "nZe$knj3p cout << "Hello, world!" << endl; dRNn 5fl } ,`Ke-
+b` op.+}r_[ XL:cfD X}v %8d"Jna 则可以如下调用 g++ 命令编译、连接并生成可执行文件: \y\W^Z0 7mqtO/xsq $ g++ -o hello hello.C +gCpw*FBkJ *vv&`qU $ ./hello kW^1E{ -Dr
zN] Hello, world -wTt|4rO1 k?BHI=^O 二.gcc/egcs 的主要选项 ~i$Nd-64 s2FlBXY -ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色,例如 asm 或 typeof 关键词。 dDswW 'z5;, -c 只编译并生成目标文件。 7ZF&|w
0#8M~6lU%/ -DMACRO 以字符串“1”定义 MACRO 宏。 1K_Tss%.
@}$+t1f -DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。 l~BHf.;\^ }baxKdWP -E 只运行 C 预编译器。 L|LiH)4J>x B.IQ
3 -g 生成调试信息。GNU 调试器可利用该信息。 Xw-z5RkV c6mZ<ND" -IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。 YC jqCc? 7v-=t|,e -LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。 9B;R#Qr3 hYDF!U:l&O -lLIBRARY 连接时搜索指定的函数库LIBRARY。 JDj!]EF#>
weMAc4B -m486 针对 486 进行代码优化。 d Ab; 8yJJ9Q2E -o FILE 生成指定的输出文件。用在生成可执行文件时。 Mb2*(NH $1d~Vs:P\ -O0 不进行优化处理。 z`{>9q "_W_O"aU -O 或 -O1 优化生成代码。 -?J
Je c1'6gF*u& -O2 进一步优化。 |{2EI$lf n.gvuFp* -O3 比 -O2 更进一步优化,包括 inline 函数。 pF(Pb)in 1Q+D/_%:r -shared 生成共享目标文件。通常用在建立共享库时。 #DhuN?
D -K
Ru}t -static 禁止使用共享连接。 xH^ .$8 nn74]-| -UMACRO 取消对 MACRO 宏的定义。 gbC_haX8. W & IU -w 不生成任何警告信息。 2Yupdx5 *R0*7.n -Wall 生成所有警告信息。
|