使用静态库文件实现程序的链接操作,既有优势也有劣势:
- 优势是,生成的可执行文件不再需要任何静态库文件的支持就可以独立运行(可移植性强);
- 劣势是,如果程序文件中多次调用库中的同一功能模块,则该模块代码势必就会被复制多次,生成的可执行文件中会包含多段完全相同的代码,造成代码的冗余。
和使用动态链接库生成的可执行文件相比,静态链接库生成的可执行文件的体积更大。
- 在
Linux
发行版系统中,静态链接库文件的后缀名通常用.a
表示; - 在
Windows
系统中,静态链接库文件的后缀名为.lib
;
2.1 创建静态链接库
静态链接库其实就相当于压缩包,其内部可以包含多个源文件。但需要注意的是,并非任何一个源文件都可以被加工成静态链接库,其至少需要满足以下 2 个条件:
- 源文件中只提供可以重复使用的代码,例如函数、设计好的类等,不能包含
main
主函数; - 源文件在实现具备模块功能的同时,还要提供访问它的接口,也就是包含各个功能模块声明部分的头文件;
示例代码结构:
wohu@ubuntu:~/cpp/src$ tree
.
├── function.h
├── greeting.cpp
├── main.cpp
└── name.cpp
0 directories, 4 files
wohu@ubuntu:~/cpp/src$
function.h
代码
void sayGreetings();
void sayName();
greeting.cpp
代码, 其中包含 #include "function.h"
,不创建静态库时可以不用包含该头文件。
#include <iostream>
#include "function.h"
void sayGreetings()
{
std::cout << "hello,world" << std::endl;
}
name.cpp
代码,其中包含 #include "function.h"
,不创建静态库时可以不用包含该头文件。
#include <iostream>
#include "function.h"
void sayName()
{
std::cout << "My name is wohu" << std::endl;
}
main.cpp
代码
#include <iostream>
#include "function.h"
int main()
{
sayGreetings();
sayName();
return 0;
}
对于name.cpp
和 greeting.cpp
都符合以上两个条件, 因此都可以被加工成静态链接库。并且根据实际需要,我们可以将它们集体压缩到一个静态链接库中,也可以各自压缩成一个静态链接库。
将源文件打包为静态链接库的过程很简单,只需经历以下 2 个步骤:
- 将所有指定的源文件,都编译成相应的目标文件