Linux——gcc编译基础知识
Linux—利用GCC开发C语言程序
我们知道,一个C/C++程序从开始编码到生成二进制可执行文件至少要经过4个步骤:
- 预处理:对源文件的宏进行展开
- 编译:将源程序编译成汇编文件
- 汇编:将汇编文件编译成机器码
- 链接:将目标文件和外部符号进行链接,生成可执行文件
GCC的最基本用法:gcc [options] [filenames]
其中options是编译器所需要的选项,filenames给出相关文件名称即可。
在这里我们只要使用-c
和-o
命令生成对应目标文件和二进制可执行文件即可。
当编写的C程序中没有自定义头文件时,可直接使用以下命令生成可执行文件并执行程序:
- gcc -c [目标文件].c -o [目标文件].o
- gcc [目标文件].o -c [可执行文件]
- ./[可执行文件]
例:
- gcc -c hello.c -o hello.o
- gcc hello.o -o hello
- ./hello
这样就可以运行一个C语言程序了。
附上hello.c文件:
#include <stdio.h>
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 <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!");
}
按之前的步骤生成可执行文件,运行:
怎么回事?原因如下:
生成hello.o文件没问题,但对该目标文件进行链接时发生了错误。
编译器提示找不到test函数,因为我们没有告诉编译器应在哪里找到这个函数。
由于test函数是在test.c中实现的,因此我们要先生成test.o文件,并将其包括进可执行文件hello,才能正确执行程序。
修改如下:
- gcc -c hello.c -o hello.o
- gcc -c test.c -o test.o
- gcc hello.o test.o -o hello
- ./hello
运行结果:
一波未平,一波又起
由于一些原因,我将test.c文件和test.h文件移入了其他目录(此处以funcitons为例)。
重新按上一次操作生成可执行文件,结果又报错了:
又是一个美丽的错误。
究其原因,我得出了以下结论:
在之前的例子中,hello.c中引用的头文件test.h这两者在同一目录中,所以可以编译成功;
一旦自定义头文件移动到了其他目录,GCC仍然会在当前目录或默认的头文件搜索路径/usr/include下寻找目标头文件。
因此我们应使用-I
选项指定搜索头文件的特殊目录。
指令修改如下:
- gcc -c functions/test.c -o test.o -Ifunctions
- gcc -c hello.c -o hello.o -Ifunctions
- gcc hello.o test.o -o hello
- ./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中定义的依赖关系自底向上执行的。
指令如下:
- vim makefile
- make
- ./hello
运行结果:
以上就是基本的GCC开发知识~