介绍
如果您是c语言程序员避免不了要使用gcc编译您的源程序,下面就介绍一下一个c语言源文件怎么使用gcc加工成可执行程序
c语言编译过程
预处理 ---> 编译 ---> 汇编 ---> 连接
如果您写好了一个c语言源文件,那么此时需要用编译程序将它处理成可执行文件。处理的过程分别是:
- 预处理:将源程序进行预处理替换,比如 #include xxx 会用xxx文件的内容替换到源程序中
- 编译:将预处理好的源文件编译成目标文件,此时不是二进制文件(中间产物)
- 汇编:将源程序翻译成汇编语言(中间产物)
- 连接:将库、目标文件等中间产物连接到一起,生成最终的二进制可执行文件
中间的过程稍有些复杂,这里简单的介绍一下:
- 根据不同系统不同编译器,处理的过程是不同的
- 有些系统编译和连接是分开的,需要分两步进行
- 像预处理和汇编等都是中间处理过程的产物,程序员只需要在用到时将它们输出即可
- gcc编译器可以用不同参数分别给出您想要的结果
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在编译连接时需要找到头文件或库文件,那么是如何找到的呢
- 首先要从 -I 参数开始找,自己给定的
- 然后寻找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH
- 接下来从默认的路径中寻找
/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 静态文件库。
结束
网友评论