Linux学习---创建静态库以及静态库链接

Linux学习---创建静态库以及静态库链接_第1张图片

创建静态库以及静态库链接

什么是静态库?
1、静态库的本质就是将目标文件打包成一个文件。
2、链接静态库就是将库中被调用的代码复制到调用模块中。
3、静态库的扩展名是.a 例:libxxx.aLinux学习---创建静态库以及静态库链接_第2张图片

1. 创建静态库

1.1. 编写源代码文件

假设我们有两个源文件:

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;
}

1.2. 编译源文件为目标文件

首先,需要将源文件 .cpp 编译成目标文件 .o。使用 g++ 或 g++ -c 来完成:

g++ -c mathfuncs.cpp
g++ -c main.cpp

这会生成 mathfuncs.o 和 main.o 两个目标文件。

1.3. 创建静态库

静态库文件使用 .a 后缀。可以通过 ar 工具来创建一个静态库,ar 是一个用于创建、修改和提取静态库文件的工具。

ar rcs libmathfuncs.a mathfuncs.o

r: 将目标文件插入到库中(如果已存在,替换原文件)。
c: 创建库文件。
s: 为库创建索引。
执行完这个命令后,会生成一个名为 libmathfuncs.a 的静态库文件。

2. 使用静态库

2.1. 链接静态库

现在我们可以使用静态库 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;
}

2.2. 链接时使用静态库

使用 g++ 编译 main.cpp 时,可以通过 -L 参数指定静态库所在的路径,使用 -l 参数指定静态库的名称(去掉前缀 lib 和后缀 .a)。例如:

g++ -o myprogram main.o -L. -lmathfuncs

这里:

-L. 指定库的路径(当前目录)。
-lmathfuncs 表示链接名为 libmathfuncs.a 的静态库。
注意:静态库的名称前缀是 lib,后缀是 .a,但链接时不需要指定这些部分。链接器会自动根据 -lmathfuncs 查找 libmathfuncs.a 文件。

2.3. 生成最终可执行文件

链接完成后,生成一个名为 myprogram 的可执行文件。

g++ -o myprogram main.o -L. -lmathfuncs

如果一切顺利,你现在可以运行生成的程序:

./myprogram

3. 静态库链接过程

静态库链接的过程包括两个阶段:

3.1. 编译阶段

在编译阶段,源代码文件会被编译为目标文件(.o 文件)。如果你的代码中引用了外部函数,编译器不会直接处理这些引用,而是将它们标记为外部符号。静态库包含了这些符号的实现。

3.2. 链接阶段

在链接阶段,链接器会将所有目标文件和静态库中的代码合并,生成最终的可执行文件。静态库的代码会被嵌入到最终的可执行文件中。这意味着在程序运行时,不需要再依赖静态库文件,所有的代码已经包含在可执行文件中。

4. 总结

创建静态库:将源文件编译为目标文件,使用 ar 命令将目标文件打包成静态库。
使用静态库:在编译程序时通过 -L 和 -l 参数链接静态库。
静态库链接:静态库的代码会被直接嵌入到最终的可执行文件中,无需在运行时加载。
创建静态库并将其链接到程序中是 C/C++ 开发中的常见操作,它允许程序员在多个程序中共享代码,并且在部署时不需要外部依赖。

你可能感兴趣的:(Linux,ARM,linux,数据库,物联网)