前言
本篇博客介绍常用gcc命令的使用,欢迎小伙伴们一起学习进步!
1.编译单个源文件并生成可执行文件
gcc hello.c -o hello
示例如下:
这里我已经写好了一个hello.c文件,内容是输出hello world!在屏幕上(使用ls命令可以才看当前目录下的文件)
hello.c文件内容如下:
#include<stdio.h>
int main()
{
printf("hello world!\n");
return 0;
}
使用上述gcc命令编译该文件,生成可执行文件hello,当然也可以命名为其他文件名
可以看到使用./+可执行文件名,已成功运行该文件
2.编译多个源文件并生成可执行文件
gcc hello.c add.c -o output
此时我在hello.c文件中调用add文件中的函数,想要正常运行,编译就需要将两个文件一起编译成一个可执行文件了
新的hello.c文件内容如下:
#include<stdio.h>
#include"add.h"
int main()
{
int a = 1;
int b = 2;
int c;
c = add(a,b);
printf("a + b = %d\n",c);
printf("hello world!\n");
return 0;
}
add.h头文件中放函数声明,add.c文件内容如下:
#include<stdio.h>
#include"add.h"
int add(int a,int b)
{
return a + b;
}
现在我们使用上述gcc命令将两个文件编译成一个可执行文件,命名为output,如下:
运行output后可以看到在屏幕上已经打印出我们期望的结果
3.仅编译但不链接
gcc -c add.c
准确的说,整个编译是分为四个阶段,分别是预编译、编译、汇编、链接,想要进一步了解的小伙伴可以自行了解一下,上述gcc命令只执行前三步,生成一个.o文件
可以看到此处已经生成了add.o文件,此文件可后续用于制作静态库
4.生成静态库文件
gcc -c add.c
ar rcs libadd.a add.o
第一步是为了生成add.o文件,我们已经有了,现在直接执行第二步,生成我们想要的静态库libadd.a,这里需要注意一下库文件的命名规范,使用lib+库名+.a,库名可以任意设置,.a代表静态库文件。ar -rcs 命令的作用是库文件不存在就创建,若存在就进行更新。
可以看到我们想要的静态库文件已经生成,这里在说说为什么会需要库文件,举个例子,假如公司A作为供应商向客户公司B提供一个功能,公司A会将写好的代码文件制作成库文件,再将头文件一起给客户公司B,头文件中包含各种函数声明,客户公司B链接该静态库调用头文件中暴露出来的接口函数就可以使用该功能了,这样客户公司B也不会知道内部代码是如何实现的,保护了公司A的利益,同时也满足了客户公司B的需求。
接下来,我们看看应该如何使用libadd.a文件,公司A提供的文件有:libadd.a和add.h,公司B有自己的文件:hello.c
我们先将其他文件全部删除,只保留这几个文件,同时创建一个目录lib用来存放库文件,目录include用来存放头文件
现在include中存放头文件,目前存放的是公司A提供的add.h,lib中存放的是公司A提供的静态库libadd.a,接下来,我们使用gcc命令将hello.c编译链接该静态库并生成一个可执行文件hello
前面已经介绍过gcc hello.c -o hello的使用,现在解释一下 -I 、-L、-l的含义:
-I 指明hello.c中引入的头文件所在目录
-L 指明使用的库文件所在目录
-l 指明使用的库文件名称
最后执行生成的可执行文件,可看到与我们的预期结果一致。
结尾
本博客主要介绍常用gcc命令的使用,希望大家看完这篇博文能学到一些知识,最后送大家一句:天下不负有心人,滴水石可穿!