一、前言
系统开发人员为了提高项目开发的效率,往往使用成熟库。如何制作静态库和动态库,是软件工程师的基本技能。通过库文件,开发人员可以将自己经常使用的函数封装到库文件中,一方面提供代码的重用,另一方面避免重复劳动,提高项目开发的速度。每一位系统研发工程师,都要学会制作和灵活使用静态库和动态库。
其实就是在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 即可。