一、什么是静态库

说明:静态库(通常以.a结尾,archive),是在编译链接期间被直接整合到最终可执行文件中的库程序生成后,它的运行就不再依赖原来的静态库文件了,静态库的存在,导致用户无法知晓代码的具体实现操作,只能根据作者提供的编译说明进行编译,得到最终结果。

优点:部署简单,程序独立,运行速度快

缺点:体积大,多个程序共用时浪费空间,库更新时需要重新编译整个程序

二、简单示例

1)准备相关源代码

        (1)test.c文件

#include "test.h"

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

        (2)test.h文件

#ifndef __TEST_H  // 定义以防止递归包含
#define __TEST_H

// (1)、其它头文件
#include <stdio.h>

// (2)、宏定义(函数、变量、常量)

// (3)、自定义类型(结构体、联合体、枚举、函数指针类型等...)

// (4)、函数声明
extern int test_add_func(int a, int b);

// (5)、全局变量声明

// (6)、静态函数定义

// (7)、静态变量定义

#endif

        (3)main.c文件

#include "test.h"

int main(int argc, char const *argv[])
{
    int result = test_add_func(1, 1);
    printf("result == %d\n", result);
    return 0;
}

2)编译生成目标文件(.o文件)

说明:gcc -c 命令只编译不链接,生成与位置无关的目标文件

1.终端命令:

gcc -c test.c -o test.o

3)创建静态库文件(.a文件)

1.终端命令:

ar rcs libexample_test.a test.o

说明:使用ar(archiver)工具将目标文件打包成静态库

r:替换或插入文件到归档文件
c:创建归档文件(如果不存在的话)
s:创建索引,相当于运行ranlib,有助于链接器更快the找到符号   

说明:静态库文件名字通常以"lib"开头,以".a"结尾

4)链接静态库进行编译

现在我们用命令告诉编译器我们要编译main.c的时候使用静态库(libexample_test.a)

1.终端命令:

gcc main.c -o main  -L ./  -lexample_test

说明:

-L:指定库路径
./ :在当前目录中寻找
-lexample_test:告诉编译器需要链接到名为example_test的库(会自动加上lib前缀.a后缀

注意:

test.h文件要保留 ,你需要告诉别人,你的库文件他人到手之后,在看不见你如何实现的代码的情况下要如何使用。
test.c文件如果你不想告诉别人你的实现代码,就没有必要将其给别人,自己留备份即可。

此时,你就可以把test.h和main.c以及静态库文件libexample_test.a打包压缩给别人用,别人无需拥有你的test.c文件即可编译成功生成main可执行文件。

5)运行程序

1.终端命令:

./main

2.现象

三、总结

静态库是一种简易的不开源隐藏方法,代码作者可以将重要的实现函数放入一个.c文件中,以此来防止他人偷窃源代码,使用者仅需要使用静态库和main.c即可实现作者所描述的功能。但是静态库亦有缺点,缺点是体积大,维护困难,当代码更新时,需要重新部署链接库文件(静态库),多个程序同时使用时浪费空间;优点则是部署简单,安全性高,生成可执行文件不依赖外部库文件。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐