c语言编译全过程(GCC)

2018-12-24  本文已影响0人  UNCOM

介绍

如果您是c语言程序员避免不了要使用gcc编译您的源程序,下面就介绍一下一个c语言源文件怎么使用gcc加工成可执行程序

c语言编译过程

预处理 ---> 编译 ---> 汇编 ---> 连接

如果您写好了一个c语言源文件,那么此时需要用编译程序将它处理成可执行文件。处理的过程分别是:

中间的过程稍有些复杂,这里简单的介绍一下:

gcc 常用参数的简要说明

源文件或生成文件后缀名 使用参数生产前面的文件 说明 备注
.c (小写) 用编辑器敲出来的文本文件,C语言的源文件
.o (小写) -c (小写) 只编译源文件,生成的目标文件(自动生成) 加 -o (小写) xxx.o 可以生成相应名字的文件
.i -E 只进行预处理,默认打印到屏幕上 加 -o (小写) xxx.i 可以生成相应名字的文件
.s (小写) -S (大写) 生成汇编文件,默认自动生成 加 -o (小写) xxx.s 可以生成相应名字的文件
-g 生成用于 dbg 可调试的文件
-O -O2 (大写) 不同等级的优化程序
-std=c99 某些编译器激活c99特性
-static 禁止使用共享连接
-shared 生成共享目标文件。通常用在建立共享库时
-ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色, 例如 asm 或 typeof 关键词
-w 不生成任何警告信息
-Wall 生成所有警告信息
# 范例:
gcc xxx.c     # 会直接生产一个 a.out 的可执行程序,-o 参数可以改名
gcc -c xxx.c  # 生成一个 xxx.o 的目标文件
gcc -E xxx.c  # 在屏幕上打印预处理后的文件
gcc -E xxx.c -o xxx.i # 将生成 xxx.i 的文件,-o 参数可以生成不同名字 如:-o zzz.i
gcc -S xxx.c  # 自动生成 xxx.s 的汇编文件,-o 参数可以改名
# 一般来说 -o 参数就是将生成的内容以不同名字保存成文件
# 如果需要用 gdb 进行调试需要添加 -g 参数

gcc 如何查找文件路径

gcc在编译连接时需要找到头文件或库文件,那么是如何找到的呢

/usr/include
/usr/local/include
/usr/lib/gcc-lib/i386-linux/2.95.2/include
/usr/lib/gcc-lib/i386-linux/2.95.2/……/……/……/……/include/g++-3
/usr/lib/gcc-lib/i386-linux/2.95.2/……/……/……/……/i386-linux/include
# 如果装gcc的时候,是有给定的prefix的话,那么就是
/usr/include
prefix/include
prefix/xxx-xxx-xxx-gnulibc/include
prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include
# 例:
gcc -o hello hello.c -l /home/hello/include -L /home/hello/lib -lworld
# 上面的这句话是在编译hello时

# -l /home/hello/include 表示:
# /home/hello/include 目录作为第一个寻找头文件的目录。
# 寻找的顺序是 /home/hello/include --> /usr/include --> /usr/local/include

# -L /home/hello/lib 表示:
# /home/hello/lib 目录作为第一个寻找库文件的目录。
# 寻找的顺序是 /home/hello/include --> /lib --> /usr/lib --> /usr/local/lib

# -lworld 表示:
# 在上面的路径中寻找 libworld.so 动态库文件。
# 如果 gcc 编译选项中加入了 -static 则表示寻找 libworld.a 静态文件库。

结束

上一篇 下一篇

猜你喜欢

热点阅读