在第一篇文章中,我们已经了解到使用gcc编译程序的基本过程,基本步骤详情可参考:
提示:以下是本篇文章正文内容,下面案例可供参考
将一些公用函数制作成函数库以便供其他程序使用。这些函数库分为静态库和动态库两种。
(1)编写程序所需要的.c
文件和.h
文件
main.c
#include"hello.h"
int main()
{
hello("everyone");
return 0;
}
hello.c
#include<stdio.h>
void hello(const char *name)
{
printf("Hello %s!\n",name);
}
hello.h
#ifndef HELLO_H
define HELLO_H
void hello(const char *name);
#endif//HELLO_H
(2)生成.o文件
(1)创建静态库(.a)
静态库的命名是以lib为前缀,紧接着跟静态库名,扩展名为.a
gcc main.c libmyhello.a -o hello
(1)创建动态库(.so)
动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib,但文件扩展名为.so
题目要求:请编写一个主程序文件 main1.c 和一个子程序文件 sub1.c, 要求:子程序sub1.c 包含一个算术运算函数 float x2x(int a,int b),此函数功能为对两个输入整型参数做某个运算,将结果做浮点数返回;主程序main1.c,定义并赋值两整型变量,然后调用函数 x2x,将x2x的返回结果printf出来。再扩展写一个x2y函数(功能自定),main函数代码将调用x2x和x2y ;将这3个函数分别写成单独的3个 .c文件,并用gcc分别编译为3个.o 目标文件;将x2x、x2y目标文件用 ar工具生成1个 .a 静态库文件, 然后用 gcc将 main函数的目标文件与此静态库文件进行链接,生成最终的可执行程序,记录文件的大小。
main.c
#include<stdio.h>
#include"sub1.h"
#include"sub2.h"
float x2x(int a,int b);
float x2y(int a,int b);
main()
{
float x,y;
int a,b;
printf("a=");
scanf("%d",&a);
printf("b=");
scanf("%d",&b);
printf("a*b=%f\n",x2x(a,b));
printf("a+b=%f",x2y(a,b));
}
sub1.c(乘法)
#include<stdio.h>
float x2x(int a,int b)
{
float x;
x=a*b;
return x;
}
sub1.h
#ifndef SUB1_H
#define SUB1_H
#include<stdio.h>
float x2x(int a,int b);
#endif
sub2.c
#include<stdio.h>
float x2y(int a,int b)
{
return a+b;
}
sub2.h
#ifndef SUB2_H
#define SUB2_H
#include<stdio.h>
float x2y(int a,int b);
#endif
这里gcc的书写格式不再赘述,上个标题已经讲过
文件大小如下:
此时文件大小如下:
静态库和动态库存在是为了将除主函数外的其他函数放在库里,以便其他程序也可以使用。而学会使用静态库与动态库,极大的方便我们的程序实现。
参考文献:
用gcc生成静态库和动态库:
“undefined reference to” 问题解决方法: