欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux——gcc编译基础知识

程序员文章站 2024-01-01 15:45:46
...

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 <stdio.h>
int main()
{
    printf("Hello World!\n");
}
运行结果:

Linux——gcc编译基础知识


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

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

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

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

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

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

按之前的步骤生成可执行文件,运行:
Linux——gcc编译基础知识

怎么回事?原因如下:
生成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
运行结果:

Linux——gcc编译基础知识


一波未平,一波又起

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

又是一个美丽的错误。

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

在之前的例子中,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头文件。

运行结果:

Linux——gcc编译基础知识

回顾

文件结构图:

第一种情况:

Linux——gcc编译基础知识

第二种情况:

Linux——gcc编译基础知识

第三种情况:

Linux——gcc编译基础知识

进阶

使用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
运行结果:

Linux——gcc编译基础知识

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

相关标签: GCC linux

上一篇:

下一篇: