Ubuntu下用glade和GTK+开发C语言界面程序(二)——gcc常用命令介绍

谈到linux,没人不懂gcc,当然,学过C语言的都该知道gcc,毕竟所有的类C编译器基本都有gcc来构成。

GCC的意思随着时间的发展也从最初的GNU C Compiler发展到GNU Compiler Collection,也就是GNU编译器的统称集合。GCC对与操作系统与硬件的的支持,可以说是:无处不在。

一、gcc编译过程

GCC的编译过程要分为四个阶段来进行:预处理阶段,编译阶段,汇编阶段,以及链接阶段。

1、预处理阶段(也称预编译阶段)

gcc -E helloworld.c -o -helloworld.i

上述的-E参数将helloworld.c 文件进行预处理,-o参数将预处理后的文件输出为helloworld.i 文件

-E 为gcc预处理参数,其后跟.c源代码文件

-o 为gcc输出文件参数,其后跟.i的文件名

2、编译阶段

gcc -S helloworld.i -o helloworld.s
-S参数将helloworld.i文件进行编译生成helloworld.s文件

-S参数为gcc编译参数,其后跟经过预处理后生成的.i文件

3、汇编阶段

gcc -c helloworld.s -o helloworld.o
-c参数将汇编代码helloworld.s进行汇编生成目标代码helloworld.o

4、链接阶段

gcc helloworld.o -o helloworld
将helloworld.o 文件进行链接,生成helloworld可执行程序

最后输入

./helloworld
可以运行可执行程序。

对于链接过程来说,又分为两种形式:

(一)静态链接,静态链接依赖的动态链接库较少,对动态链接库的版本不会太敏感,具有较好的兼容性,当然这样生成的程序比较大。静态库的文件后缀名为 .a

(二)动态链接,生成的程序比较小,占用的内存较少。动态库的文件后缀名为 .so

二、用gcc编译程序

对于我们在linux下写的C程序,不必像上面那样面面俱到的来进行编译,可以用一行命令来直接生成可执行文件。
gcc -Wall -g -o helloworld helloworld.c
上面命令将helloworld.c文件直接编译生成可执行程序helloworld。
-o为输出参数,其后跟可执行文件的名字
-Wall开启gcc编译器几乎所有的常用的警告,强烈建议在编译过程中使用此参数。-Wall是最常用的编译警告参数,编译的警告非常有助于检测程序存在的问题。
-g参数表示生成的目标文件带调试信息,调试信息可以在程序异常退出时,版主分析错误产生的源头,包括产生的错误文件名和行号等信息。

编译多个文件

当开发的程序有多个源文件时,可以使用下面的命令
gcc -Wall -g -filename1.c -filename2.c -filename3.c filename4.c filenameX.c -o main
上面的命令编译多个源文件,并生成可执行文件main
对于编译过程中如果编译的源文件的头文件和.c文件不在一个目录下,可以使用 -I(大写i)参数来进行关联其他目录中的文件
例如
gcc -Wall -g -fliename.c -I /home/filename/inc -o main
上面的命令将会首先到/home/filename/inc中寻找头文件,之后才会引入库函数中的头文件和本地文件夹下的头文件
如果程序中使用了非库文件中的文件,例如,#include <math.h>,那么还需要关联相应的库文件后编译才不会出错,关联动态库的参数为-l(小写l,不是i),,后面跟需要关联的动态库的名字
例如
gcc -Wall -g -o main -lm main.c
-lm即表示关联系统库中的libm.a文件, 路径为/usr/lib/libm.a。
-l参数后面紧跟库名

-L(大写l)参数可以指定具体的目录,是编译器在搜寻系统库目录前先搜寻此目录

例如
gcc -Wall -g -L ./lib -lhello -o helloworld
上面命令执行时会首先到当前目录的lib下寻找库文件,之后才到系统库中寻找需要的库文件。


OK,到这里相信对gcc编译命令有了一个初步的了解,常用的使用gcc的命令也都在上面给出了具体的例子,下一篇中会写些关于make命令的使用方法和构建自己的makefile文件来使编译更加简单更加智能。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。