美文网首页
c语言编译全过程(GCC)

c语言编译全过程(GCC)

作者: UNCOM | 来源:发表于2018-12-24 19:51 被阅读0次

介绍

如果您是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 静态文件库。

结束

相关文章

  • centos安装mysql5.5

    相关准备 gcc、gcc-c++//c语言编译 cmake//mysql编译 ncurses-devel//字符终...

  • MDK编译过程及文件类型全解

    C语言编译步骤 1.预处理 gcc -E2.编译 gcc -S3.汇编 gcc -C4....

  • c语言编译全过程(GCC)

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

  • 2021-02-19 cc/gcc/g++/CC

    gcc全称是Gun C语言编译器。原本只能处理C语言,gcc很快地扩展,现在的gcc可以说是GNU编译器集合(可编...

  • [C++之旅] 0 Mac下编译运行C/C++

    [C++之旅] 0 Mac下编译运行C/C++ 编译c语言时采用gcc指令 编译c++语言时采用g++指令 以下以...

  • c课堂笔记 day-1

    c语言之父:丹尼斯.里奇 c语言的优缺点:看书查找 1.c的引入: gcc编译的格式:gcc hello.c -o...

  • CentOS6.5安装FastDFS

    1.安装gcc(c语言开发,需要使用gcc编译) 命令:yum install make cmake gcc gc...

  • Linux高级环境编程

    1. 编译的四个步骤: 预处理gcc -E test.c -o test.i 编译:将高级语言编译成汇编语言gcc...

  • 面试常问C++基础

    有关语言基础: c/c++程序的编译过程(GCC的编译流程) 强类型语言 VS 弱类型语言 数组和指针的区别 字符...

  • 2018-04-16安装nginx

    一.安装gcc 安装 nginx 需要先将官网下载的源码进行编译,nginx是C语言编写的,编译依赖 gcc 环境...

网友评论

      本文标题:c语言编译全过程(GCC)

      本文链接:https://www.haomeiwen.com/subject/ructlqtx.html