Linux——gcc编译基础知识

Linux—利用GCC开发C语言程序


我们知道,一个C/C++程序从开始编码到生成二进制可执行文件至少要经过4个步骤:

  1. 预处理:对源文件的宏进行展开
    • 编译:将源程序编译成汇编文件
    • 汇编:将汇编文件编译成机器码
    • 链接:将目标文件和外部符号进行链接,生成可执行文件

GCC的最基本用法:gcc [options] [filenames]

其中options是编译器所需要的选项,filenames给出相关文件名称即可。

在这里我们只要使用-c-o命令生成对应目标文件和二进制可执行文件即可。


当编写的C程序中没有自定义头文件时,可直接使用以下命令生成可执行文件并执行程序:

  1. gcc -c [目标文件].c -o [目标文件].o
  2. gcc [目标文件].o -c [可执行文件]
  3. ./[可执行文件]

例:

  1. gcc -c hello.c -o hello.o
  2. gcc hello.o -o hello
  3. ./hello

这样就可以运行一个C语言程序了。

附上hello.c文件:

#include 
int main()
{
    printf("Hello World!\n");
}
运行结果:


现在我们对hello.c进行一下更改:

增加一个test.h头文件和test.c文件:

//test.h
#ifndef _TEST_H
#define _TEST_H
void test(char *str);
#endif

//test.c
#include 
#include "test.h"
void test(char *str)
{
    printf("This is test print:%s\n",str);
}

修改hello.c文件(注意:引用自定义头文件时使用”“而非<>):

#include "test.h"
#include 
int main()
{
    test("Hello World!");
}

按之前的步骤生成可执行文件,运行:

怎么回事?原因如下:
生成hello.o文件没问题,但对该目标文件进行链接时发生了错误。
编译器提示找不到test函数,因为我们没有告诉编译器应在哪里找到这个函数。

由于test函数是在test.c中实现的,因此我们要先生成test.o文件,并将其包括进可执行文件hello,才能正确执行程序。

修改如下:
  1. gcc -c hello.c -o hello.o
  2. gcc -c test.c -o test.o
  3. gcc hello.o test.o -o hello
  4. ./hello
运行结果:


一波未平,一波又起

由于一些原因,我将test.c文件和test.h文件移入了其他目录(此处以funcitons为例)。
重新按上一次操作生成可执行文件,结果又报错了:

又是一个美丽的错误。

究其原因,我得出了以下结论:

在之前的例子中,hello.c中引用的头文件test.h这两者在同一目录中,所以可以编译成功;
一旦自定义头文件移动到了其他目录,GCC仍然会在当前目录或默认的头文件搜索路径/usr/include下寻找目标头文件。

因此我们应使用-I选项指定搜索头文件的特殊目录。

指令修改如下:
  1. gcc -c functions/test.c -o test.o -Ifunctions
  2. gcc -c hello.c -o hello.o -Ifunctions
  3. gcc hello.o test.o -o hello
  4. ./hello

其中斜体部分代表告诉GCC在哪找到test.c源文件和在functions目录下搜索test.h头文件。

运行结果:

回顾

文件结构图:

第一种情况:

第二种情况:

第三种情况:

进阶

使用make命令和makefile文件自动化编译C语言程序

在建立好hello.c、test.c、test.h的前提上,建立makefile文件。

makefile文件内容:

hello:hello.o test.o
gcc hello.o test.o -o hello
hello.o:hello.c
gcc -c hello.c -o hello.o -Ifunctions
test.o:functions/test.c functions/test.h
gcc -c functions/test.c -o test.o -Ifunctions

其中make工具执行时是根据makefile中定义的依赖关系自底向上执行的。

指令如下:
  1. vim makefile
  2. make
  3. ./hello
运行结果:

以上就是基本的GCC开发知识~

你可能感兴趣的:(linux,GCC,linux)