目录

一,简介

二,如何生成静态链接库

1.准备测试程序

三,如何使用静态链接库 

 1.生成静态链接库

  2.使用静态链接库


一,简介

这里我们只讲 Linux 环境下的静态库与动态库的生成与使用, Windows直接用VS直接就能生成。

在项目中使用库一般有两个目的,一个是为了使程序更加简洁不需要在项目中维护太多的源文件,另一方面是为了源代码保密,毕竟不是所有人都想把自己编写的程序开源出来。

当我们拿到了库文件(动态库、静态库)之后要想使用还必须有这些库中提供的 API 函数的声明,也就是头文件,把这些都添加到项目中,就可以快乐的写代码了。

二,如何生成静态链接库

 在 Linux 中静态库由程序 ar 生成。

在 Linux 中静态库以 lib 作为前缀,以.a 作为后缀,中间是库的名字自己指定即可,即: libxxx.a
在 Windows 中静态库一般以 lib 作为前缀,以 lib 作为后缀,中间是库的名字需要自己指定,即: libxxx.lib

1.准备测试程序

加法计算源文件 add.c:

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

int add(int a, int b)
{
    return a+b;
}

 减法计算源文件 sub.c:

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

int subtract(int a, int b)
{
    return a-b;
}

乘法计算源文件 mult.c:

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

int multiply(int a, int b)
{
    return a*b;
}

 除法计算的源文件 div.c

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

double divide(int a, int b)
{
    return (double)a/b;
}

 头文件

#ifndef _HEAD_H
#define _HEAD_H
// 加法
int add(int a, int b);
// 减法
int subtract(int a, int b);
// 乘法
int multiply(int a, int b);
// 除法
double divide(int a, int b);
#endif

 测试程序

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

int main()
{
    int a = 20;
    int b = 12;
    printf("a = %d, b = %d\n", a, b);
    printf("a + b = %d\n", add(a, b));
    printf("a - b = %d\n", subtract(a, b));
    printf("a * b = %d\n", multiply(a, b));
    printf("a / b = %f\n", divide(a, b));
    return 0;
}

 代码结构

三,如何使用静态链接库 

 1.生成静态链接库

生成静态库,需要先对源文件进行汇编操作 (使用参数 -c) 得到二进制格式的目标文件 (.o 格式), 然后在通过 ar 工具将目标文件打包就可以得到静态库文件了 (libxxx.a)。

使用 ar 工具创建静态库的时候需要三个参数:

参数c:创建一个库,不管库是否存在,都将创建。
参数s:创建目标文件索引,这在创建较大的库时能加快时间。
参数r:在库中插入模块 (替换)。默认新的成员添加在库的结尾处,如果模块名已经在库中存在,则替换同名的模块。

 # 1.:将源文件 add.c, div.c, mult.c, sub.c 进行汇编,得到二进制目标文件 add.o, div.o, mult.o, sub.o

# -I :重新指定要搜索的文件目录。
gcc -c add.c sub.c div.c muli.c -I ./include/

# 2. 将生成的目标文件 .o 打包成静态库 (采用gcc内部的ac进行生成静态链接库)

参数c:创建一个库,不管库是否存在,都将创建。
参数s:创建目标文件索引,这在创建较大的库时能加快时间。
参数r:在库中插入模块 (替换)。默认新的成员添加在库的结尾处,如果模块名已经在库中存在,则替换同名的模块。

ar rcs libCalc.a *.o

 

  2.使用静态链接库

 #3. 得到了一个可用的静态库之后,将其与相应的头文件放到一个目录中(就相当于发布了),然后根据得到的头文件编写测试代码,对静态库中的函数进行调用。

这里我把生成的静态库和相应的头文件放到temp文件夹中进行测试。
这里我们会用到gcc的两个参数

-l :在程序编译的时候,指定使用的库。(静态库的名字一定要掐头去尾。如:libCalc.a变为Calc)
-L :在程序编译的时候,指定使用的库的路径。
​​​​​​​

gcc main.c -o Calc -L ./ -l Calc

 

最后测试结果 

 完成啦。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐