本文介绍使用gcc编译及链接的常用命令。
基本用法
1. gcc main.c
可以直接编译连接该文件,生成可执行文件a.out
1 2 3 4 5 6 7 |
[yalewoo@localhost test]$ ls main.c [yalewoo@localhost test]$ gcc main.c [yalewoo@localhost test]$ ls a.out main.c [yalewoo@localhost test]$ ./a.out hello world! |
2. 使用-o选项 指定生成可执行文件的名字
使用格式有两种,注意-o后面要跟可执行文件名 中间不能有其他的
gcc main.c -o abcdef
gcc -o abcdef main.c
会生成可执行文件 abcdef
3. -Wall 打开常用警告
开启警告选项可以帮助我们发现一些潜在的错误。 Linux命令的各个选项和参数之间的位置是随便的。
下面六种写法是相同的
1 2 3 4 5 6 |
gcc -o abcd -Wall main.c gcc -o abcd main.c -Wall gcc -Wall -o abcd main.c gcc -Wall main.c -o abcd gcc main.c -o abc -Wall gcc main.c -Wall -o abc |
虽然如此,推荐使用 Gcc [选项] 要编译的文件 [选项] [目标文件] 这种格式。
4. 使用-g选项加入调试信息
若要调试程序就必须加入调试信息,使用gdb调试的入门教程可以参照雅乐网这篇文章。
gcc的4个编译流程
gcc的编译流程分为四个步骤:预处理 编译 汇编 链接
以main.c为例子,在这四个步骤中可以设置选项分别生成main.i, main.s, main.o以及最终的main文件:
main.c : 最初的源代码文件;
main.i : 经过编译预处理的源代码;
main.s : 汇编处理后的汇编代码;
main.o : 编译后的目标文件,即含有最终编译出的机器码,但它里面所引用的其他文件中函数的内存位置尚未定义。
· 预处理(Pre-Processing)
使用-E选项 进行预处理 如果不指定目标文件名 则显示到屏幕 指定文件名 一般为.i后缀
gcc -E main.c 进行预处理 结果显示到屏幕
gcc -E main.c -o abcd.i 预处理 目标文件abcd.i
· 编译(Compiling)
编译阶段把c代码转换为汇编代码。
使用-S 命令 只进行编译 生成汇编文件
gcc -S main.c -o main.s
gcc -S main.i -o main.s
· 汇编(Assembling)
使用-c选项 生成目标二进制代码 .o文件 (只激活预处理,编译,和汇编)
gcc -c main.c -o main.o
.o文件是二进制机器码的形式,但它里面所用到的外部函数的内存位置尚未定义。
· 链接(Linking)
链接阶段将二进制文件与其它的机器代码文件和库文件汇集成一个可执行的二进制代码文件。就是最终的可执行文件了
gcc main.c -o main 生成main可执行文件。
其他参数
-ansi
关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性(包括禁止一 些asm inline typeof关键字,以及UNIX,vax等预处理宏。
-O0 -O1 -O2 -O3
编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-ldirname
将dirname所指出的目录加入到程序头文件目录列表中。
-Ldirname
将dirname所指出的目录加入到库文件的目录列表中。
-llibname
在链接时,装载名字为“libname.a“的函数库,该函数库位于系统预设的目录或由-L选项确定的目录下。
-static
静态链接库文件。
多文件编译
如果原文件分布于多个文件中:file1.c, file2,c
$ gcc -Wall file1.c file2.c -o name
若对其中一个文件作了修改,则可只重新编译该文件,再连接所有文件:
$ gcc -Wall -c file2.c
$ gcc file1.c file2.o -c name