问题产生原因

我们都知道我们写一个程序不可能所有东西都重头去开发,因此我们会使用一些其它人写好的文件或者说叫做库函数等。但是有时候因为路径的设置不对,或者是文件的丢失,或者是文件版本不对,或者是文件的编码不对,都可能导致我们无法编译成功。

c语言编译过程

  1. 预处理生成.i文件。
  2. 生成汇编语言.s文件
  3. 生成机器码.o文件
  4. 链接机器代码生成可执行文件

gcc编译参数说明

了解了c语言的编译过程,我们就来介绍gcc的各个参数,来分别对照各个步骤。

  1. gcc -E main.c -o main.i(进行预处理 .i文件)
  2. gcc -S main.i -o main.s (生成汇编代码.s文件)
  3. gcc -c main.s -o main.o (生成机器码.o文件)
  4. gcc main.o -o main.exe (生成可执行文件windows)

各个过程图片如下:

i文件

s文件

o文件

当然了,平时我们写程序的时候不需要这么复杂的过程,我们可以直接一步编译生成可执行文件

gcc main.c -o main.exe

如果需要调试,我们需要使用-g 选项

编译时需要的一些其它参数

有些时候我们还需要链接一些其它的库文件,这个时候我们可以使用-l选项,比如我们使用SGL图形库的时候,我们可能就需要-lSGL2选项来加载所需要的函数链接库。

解决问题办法

如我们之前所说的一样,我们需要使用-l来加载一些缺少的函数库文件。

头文件找不到的话,我们就指定头文件搜索路径 -I
库文件找不到的话,我们就指定库文件搜索路径 -L
当然我们也可以使用-l(小写L)来指定具体的库文件

在linux上的系统会有LD_LIBRARY_PATH这个环境变量,它里面定义了库文件的路径,如果我们有新的库,可以把它加入到这个环境变量里面。