生成Linux静态库步骤:
- 写源文件,通过
gcc -c xxx.c
生成目标文件。 - 用
ar
归档目标文件,生成静态库。 - 配合静态库,写一个使用静态库中函数的头文件。
- 使用静态库时,在源码中包含对应的头文件,链接时通过-L以及-l等来链接自己的库。
具体实例:
写源文件,生成目标文件:
第一个源文件my_print.c
#include <stdio.h>
void myprint(const char * message)
{
fprintf(stdout, "%s\n", message);
}
第二个源文件my_math.c
int my_add(int a, int b)
{
return a + b;
}
int my_subtract(int a, int b)
{
return a - b;
}
使用gcc,为这两个源文件生成目标文件:
gcc -c my_print.c my_math.c
我们就得到了 my_print.o 和 my_math.o。
得到静态库:
ar crv libmylib.a my_print.o my_math.o
我们就得到了libmylib.a,这就是我们需要的静态库。
上述命令中 crv 是 ar的命令选项:
- c 如果需要生成新的库文件,不要警告
- r 代替库中现有的文件或者插入新的文件
- v 输出详细信息
生成对应的头文件:
头文件定义了 libmylib.a 的接口,也就是告诉用户怎么使用 libmylib.a。
新建my_lib.h, 写入内容如下:
#ifndef __MY_LIB_H__
#define __MY_LIB_H__
int my_add(int a, int b);
int my_subtract(int a, int b);
void my_print(const char *);
#endif
测试我们的静态库:
在同样的目录下,建立 test.c:
#include "my_lib.h"
#include <stdio.h>
int main(int argc, char *argv[])
{
int c = my_add(15, -21);
my_print("I am a func from mylib ...");
print("%d"\n, c);
return 0;
}
编译test.c
gcc test.c -L. -lmylib
上面的命令中 -L.
告诉 gcc 搜索链接库时包含当前路径, -lmylib
告诉 gcc 生成可执行程序时要链接 libmylib.a
。
通过makefile自动化:
.PHONY: build test
build: libmylib.a
libmylib.a: my_math.o my_print.o
ar crv $@ my_math.o my_print.o
my_math.o: my_math.c
gcc -c my_math.c
my_print.o: my_print.c
gcc -c my_print.c
test: a.out
a.out: test.c
gcc test.c -L. -lmylib
makefile写好后,运行 make build
将会构建 libmylib.a, 运行 make test
将会生成链接 libmylib.a 的程序。