什么是静态库?
1、静态库的本质就是将目标文件打包成一个文件。
2、链接静态库就是将库中被调用的代码复制到调用模块中。
3、静态库的扩展名是.a 例:libxxx.a
假设我们有两个源文件:
mathfuncs.cpp:
#include
void add(int a, int b) {
std::cout << "Addition: " << a + b << std::endl;
}
void subtract(int a, int b) {
std::cout << "Subtraction: " << a - b << std::endl;
}
main.cpp:
#include "mathfuncs.cpp"
int main() {
add(10, 5);
subtract(10, 5);
return 0;
}
首先,需要将源文件 .cpp 编译成目标文件 .o。使用 g++ 或 g++ -c 来完成:
g++ -c mathfuncs.cpp
g++ -c main.cpp
这会生成 mathfuncs.o 和 main.o 两个目标文件。
静态库文件使用 .a 后缀。可以通过 ar 工具来创建一个静态库,ar 是一个用于创建、修改和提取静态库文件的工具。
ar rcs libmathfuncs.a mathfuncs.o
r: 将目标文件插入到库中(如果已存在,替换原文件)。
c: 创建库文件。
s: 为库创建索引。
执行完这个命令后,会生成一个名为 libmathfuncs.a 的静态库文件。
现在我们可以使用静态库 libmathfuncs.a 来链接我们的程序。在 main.cpp 中,我们包含了 mathfuncs.cpp 代码,但通常,我们会将头文件放在 mathfuncs.h 中,以便管理库的接口。
首先,为 mathfuncs.cpp 创建一个头文件 mathfuncs.h:
mathfuncs.h:
#ifndef MATHFUNCS_H
#define MATHFUNCS_H
void add(int a, int b);
void subtract(int a, int b);
#endif // MATHFUNCS_H
然后,我们更新 main.cpp:
#include "mathfuncs.h"
int main() {
add(10, 5);
subtract(10, 5);
return 0;
}
使用 g++ 编译 main.cpp 时,可以通过 -L 参数指定静态库所在的路径,使用 -l 参数指定静态库的名称(去掉前缀 lib 和后缀 .a)。例如:
g++ -o myprogram main.o -L. -lmathfuncs
这里:
-L. 指定库的路径(当前目录)。
-lmathfuncs 表示链接名为 libmathfuncs.a 的静态库。
注意:静态库的名称前缀是 lib,后缀是 .a,但链接时不需要指定这些部分。链接器会自动根据 -lmathfuncs 查找 libmathfuncs.a 文件。
链接完成后,生成一个名为 myprogram 的可执行文件。
g++ -o myprogram main.o -L. -lmathfuncs
如果一切顺利,你现在可以运行生成的程序:
./myprogram
静态库链接的过程包括两个阶段:
在编译阶段,源代码文件会被编译为目标文件(.o 文件)。如果你的代码中引用了外部函数,编译器不会直接处理这些引用,而是将它们标记为外部符号。静态库包含了这些符号的实现。
在链接阶段,链接器会将所有目标文件和静态库中的代码合并,生成最终的可执行文件。静态库的代码会被嵌入到最终的可执行文件中。这意味着在程序运行时,不需要再依赖静态库文件,所有的代码已经包含在可执行文件中。
创建静态库:将源文件编译为目标文件,使用 ar 命令将目标文件打包成静态库。
使用静态库:在编译程序时通过 -L 和 -l 参数链接静态库。
静态库链接:静态库的代码会被直接嵌入到最终的可执行文件中,无需在运行时加载。
创建静态库并将其链接到程序中是 C/C++ 开发中的常见操作,它允许程序员在多个程序中共享代码,并且在部署时不需要外部依赖。