【Linux】Linux下的gcc编译以及静态库和动态库的制作以及make的使用

一、前言

系统开发人员为了提高项目开发的效率,往往使用成熟库。如何制作静态库和动态库,是软件工程师的基本技能。通过库文件,开发人员可以将自己经常使用的函数封装到库文件中,一方面提供代码的重用,另一方面避免重复劳动,提高项目开发的速度。每一位系统研发工程师,都要学会制作和灵活使用静态库和动态库。
其实就是在Linux里运行c语言,用gcc编译器编译c语言,所谓的库也就是我们之前学c/c++面向对象程序设计时 写的头文件

二、gcc编译器

1、gcc编译器工作过程:

在这里插入图片描述

2、gcc编译器编译过程:

在这里插入图片描述

3、gcc编译器常用选项

在这里插入图片描述

4.实例练习

根据用户的宏定义,进行圆的面积和长方形面积的计算。
先用vim写个头文件compute_area.h 主要交代宏观上要实现的功能——计算面积(圆和长方形):

#ifndef __COMPUTE_AREA__
#define __COMPUTE_AREA__

double CircleArea(double radius);
double RectangleArea(double length, double width);


#endif

再写个compute_area.c具体实现计算它们面积的功能:

#include "compute_area.h"
#include <stdio.h>

#define PI 3.14

/*
 * Function: Compute the area of circle
 * Parameters:
 *           radius   radius of circle
 * Return:
 *       -1.0  error
 *       >= 0  circle area
 */
double CircleArea(double radius)
{
   double circle_area = 0.0;
   if( radius < 0 )
   {
	printf("The parameter radius is %lf, check again!!\n",radius);
	return -1.0;
   }
   circle_area = PI * radius * radius;
   return circle_area;
}


/*
 *Function: Compute the area of rectangle.
 *Parameters:
 *         length   rectangle length
 *         width    rectangle width
 *Return:
 *        -1.0   error
 *        >=0.0  area of the rectangle
 */

double RectangleArea(double length, double width)
{
  doulbe rec_area = 0.0;
  if( length < 0 || width < 0)
  {
      printf("Lenght: %lf, Width: %lf. Please check parameters again!! \n",length, width);
      return -1.0;
  }
  rec_area = length * width;
  return rec_area;
}

最后写个main.c进行测试:

#include <stdio.h>
#include "compute_area.h"

int main()
{
   double radius = 3.0;
   double length = 5.0, width = 4.0;
   printf("The area of circle(radius: %lf) is %lf\r\n",radius, CircleArea(radius));
   printf("The area of rectangle(length: %lf, width:%lf) is %lf\r\n",length, width, RectangleArea(length, width));

   return 0;
}

然后输入gcc main.c compute_area.c,就会默认生成一个a.out文件,然后执行它即可。如果想取个名字,就gcc main.c compute_area.c -o filename.out 即可。而你不加后缀名,直接gcc main.c compute_area.c -o filename,最后./filename也是可以执行的,并且和filename.out一样。
在这里插入图片描述
.o是由源文件.c编译生成的二进制目标文件,还要经过链接才能变成可执行文件。
.out是.o链接生成的,表示的是在linux的可执行文件。
.o文件一般是通过编译的但还未链接的,
.out文件一般都是经过相应的链接产生的可执行文件。

(我们写好.c文件和.h文件,然后gcc对其预处理、编译、汇编后变成了.o文件,但是还不能执行,然后链接后成了.out文件,就可以执行了。)
如果要细分整个gcc编译过程(预处理-编译-汇编-链接)的话,向下面这样写:

#省时省力版
gcc main.c compute_area.c   #直接产生可执行文件
gcc main.c compute_area.c -o filename  #直接产生可执行文件并且取了个名字(-o就是取名字的,前面那个表格有说)

#细节版
gcc -c main.c compute.c   #此刻生成了main.o和compute_area.o两个二进制目标文件
gcc  main.o compute.o -o filename
就成了

一个是直接生成可执行文件,一个是先生产.o二进制目标文件后再生成可执行文件。

三、制作静态库的步骤

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

此刻就名为libarea.a的静态库就生成了。
在这里插入图片描述
以往还得gcc main.c compute_area.c,现在只需要gcc main.c即可。

四、制作动态库的步骤

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、自动化管理工具——make

make工具能够根据文件修改时间,自动识别出需要进行重新编译的文件;而对于没有修改过的源代码,保持原有编译生成的目标文件不变。
软件工程师在使用make工具之前,需要根据项目的源代码,编写make运行的脚本文件Makefile。make工具根据Makefile中的规则,确定项目文件之间的依赖关系,确定其编译的先后顺序。
makefile文件示例如下:
在这里插入图片描述
使用Make管理器非常简单,只需在make命令的后面键入目标名即可建立指定的目标,如果直接运行make,则建立Makefile中的第一个目标。
直接输入make 即可。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值