前言

我们通常把一些公用函数制作成函数库,供其他程序使用。函数库分为静态库和动态库两种。本文讲解如何制作属于自己的静态库。

什么是静态库?

通常来说,静态库以.a作为后缀,且以lib开头。类似于libxxx.a。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。

ar命令详解

Linux ar命令用于创建或者操作静态库。

ar命令的参数如下:

参数

意义

-r

将objfile文件插入静态库尾或者替换静态库中同名文件

-x

从静态库文件中抽取文件objfile

-t

打印静态库的成员文件列表

-d

从静态库中删除文件objfile

-s

重置静态库文件索引

-v

显示详细信息

-c

创建静态库文件

制作静态库

test.c

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


void test(){

	printf("This is a static library\n");

}

test.h

#define __TEST_H__
#ifndef __TEST_H__

void test();

#endif

编译成可重定位文件,即生成.o文件:

iOS 打包静态时没有生成Modules 打包静态库用的是ar命令_静态库

为了制作成静态库,我们需要使用ar命令。

ar -rcs libtest.a test.o   #库名一般以.a为扩展名,以lib开头
 ar -t libtest.a  #查看内容
test.o

iOS 打包静态时没有生成Modules 打包静态库用的是ar命令_程序猿_02

输出信息可以看到,静态库以.a作为后缀,且以lib开头,这时候就制作好了自己的静态库了。

制作好了静态库,下面来使用它。

静态库的使用

编写一个main.c文件进行测试:

iOS 打包静态时没有生成Modules 打包静态库用的是ar命令_#include_03


main.c

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

int main(int argc, char const *argv[])
{
	test();
	
	return 0;
}

iOS 打包静态时没有生成Modules 打包静态库用的是ar命令_程序猿_04


出现信息为test未定义引用,原因是test已经编译成静态库。解决办法为:

iOS 打包静态时没有生成Modules 打包静态库用的是ar命令_程序猿_05

静态库的代码在编译时链接到应用程序中,因此编译时库文件必须存在,并且需要通过"-L"参数传递路径给编译器。

链接的库名为libtest.a,在链接的时候,去掉开头的lib和后缀.a,前面再加l,就变成了-ltest,其他库也是类似。