一、认识静态库
- 以.a作为后缀名,在Linux下一般命名为libxxx.a;
- 程序使用静态库时,连接器(ld)将整个libxxx.a的所有函数都复制到可执行文件中;
二、优缺点
优点:采用静态库时,编译成可执行文件后,运行时不依赖与该库。
缺点:可执行文件较大,且静态库有变化,可执行文件得重新生成。
三、如何创建和使用静态库
工具:ar,将目标文件.o打包成一个单独的静态库。
Linux下制作静态库的步骤:
- 编辑源代码文件(.c、.cpp)
- 通过gcc -c *.c 或折g++ -c *.cpp生成目标文件*.o
- 使用ar打包目标文件,生成静态库
- 针对静态库提供头文件(即静态库对外提供的服务接口等*.h文件)
ar命令的使用:
语法:ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files...
参数:
指令参数
-d 删除库文件中的成员文件
-m 变更成员文件在库文件中的次序
-p 显示库文件中的成员文件内容
-q 将文件附加在库文件末端
-r 将文件插入库文件中
-t 显示库文件中所包含的文件
-x 自库文件中取出成员文件
选项参数
a<成员文件> 将文件插入库文件中指定的成员文件之后。
b<成员文件> 将文件插入库文件中指定的成员文件之前。
c 建立库文件。
f 为避免过长的文件名不兼容于其他系统的ar指令指令,因此可利用此参数,截掉要放入库文件中过长的成员文件名称。
i<成员文件> 将问家插入库文件中指定的成员文件之前。
o 保留库文件中文件的日期。
s 若库文件中包含了对象模式,可利用此参数建立备存文件的符号表。
S 不产生符号表。
u 只将日期较新文件插入库文件中。
v 程序执行时显示详细的信息。
V 显示版本信息。
四、栗子
test.h
int add(int a, int b);
test.cpp
#include "test.h"
int add(int a, int b)
{
return (a + b);
}
编译:
[xy@xunye ar]$ g++ -c test.cpp
[xy@xunye ar]$ ls
test.cpp test.h test.o
创建静态库:
[xy@xunye ar]$ ar rcs libtest.a *.o
[xy@xunye ar]$ ls
libtest.a test.cpp test.h test.o
使用静态库:
main.cpp
#include "test.h"
#include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{
cout << add(3, 2) << endl;
return 0;
}
创建可执行文件:
[xy@xunye use_lib]$ ls
libtest.a main.cpp test.h
[xy@xunye use_lib]$ g++ -o main main.cpp -L. -ltest
[xy@xunye use_lib]$ ls
libtest.a main main.cpp test.h
[xy@xunye use_lib]$ ./main
5
说明:-L 指定g++查找静态库的路径;“.”表示在当前路径下查找
-l 指定具体的库,其中lib和.a可以不用显示写出
【注】gcc或g++搜索库的顺序:先找动态库.so,如果找不到再找静态库.a。