1.先看一个图示:

gcc编译过程详解_文件目录

一个.C文件,首先需要经过预处理得到.i文件,然后编译得到.s文件,在通过汇编得到汇编码.O文件。

最后再将其链接起来得到我们的可执行文件。

2.gcc的使用方法

gcc 【选项】 文件名

3.gcc 使用列子

gcc hello.c //输出一个名为hello.out的可执行程序

gcc -o hello hello.c  // 输出名为hello的可执行程序,然后可以执行hello

gcc -o hello hello.c -static   //静态链接(文件较大),,,不加static就是动态链接,文件较小

​实际工作中的重点:gcc -c -o hello.o hello.c   //将c文件编译生成o汇编文件,不进行链接

实际工作中的重点:​gcc -o hello.o   //将这些o的汇编文件,全部都链接起来

4.0控制编译过程

一个c/c++文件要经过预处理、编译、汇编和链接才能变成可执行文件。

(1)预处理C/C++源文件中,以“#”开头的命令被称为预处理命令,如包含命令“#include”、宏定义命令“#define”、条件编译命令“#if”、“#ifdef”等。预处理就是将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些东西输出到一个“.i”文件中等待进一步处理。

(2)编译编译就是把C/C++代码(比如上述的“.i”文件)“翻译”成汇编代码。

(3)汇编汇编就是将第二步输出的汇编代码翻译成符合一定格式的机器代码,在Linux系统上一般表现为ELF目标文件(OBJ文件)。“反汇编”是指将机器代码转换为汇编代码,这在调试程序时常常用到。

(4)链接链接就是将上步生成的OBJ文件和系统库的OBJ文件、库文件链接起来,最终生成了可以在特定平台运行的可执行文件。

hello.c(预处理)->hello.i(编译)->hello.s(汇编)->hello.o(链接)->hello

2.2.3 指定头文件目录

头文件在哪里?

  • 系统目录
  • 系统目录在哪?工具链里的某个include目录
  • 怎么确定?
echo 'main(){}'| gcc -E -v -  // 它会列出头文件目录、库目录(LIBRARY_PATH)
  • 可以不使用系统include目录吗?可以,编译时指定参数​​-nostdinc​
  • 可以自己指定头文件目录
-I <头文件目录>

2.2.4 指定库文件

库文件在哪里?

  • 系统目录
  • 系统目录在哪?工具链里的某个lib目录
  • 怎么确定?
echo 'main(){}'| gcc -E -v -  // 它会列出头文件目录、库目录(LIBRARY_PATH)
  • 可以不使用系统lib目录吗?可以,编译时指定参数​​-nostdlib​
  • 可以自己指定库文件目录
-L <库文件目录>
  • 指定库文件
-l  <abc>   // 链接 libabc.so 或 lib.a