在 Linux 环境下使用 GCC 生成静态库(.a 文件)并调用,通常分为以下几个步骤:
1. 创建静态库
1.1 编写源代码
假设我们要创建一个数学库 libmath.a,包含加法和减法功能。
math.h(头文件):
#ifndef MATH_H
#define MATH_H
int add(int a, int b);
int sub(int a, int b);
#endif
add.c(加法实现):
#include "math.h"
int add(int a, int b) {
return a + b;
}
sub.c(减法实现):
#include "math.h"
int sub(int a, int b) {
return a - b;
}
1.2 编译为目标文件
gcc -c add.c -o add.o # 生成 add.o
gcc -c sub.c -o sub.o # 生成 sub.o
-c选项表示只编译不链接。
1.3 打包为静态库
ar rcs libmath.a add.o sub.o
ar:归档工具,用于创建静态库。rcs:
-
r:替换已存在的文件。c:创建库(如果不存在)。s:添加索引(加快链接速度)。
2. 调用静态库
2.1 编写主程序
main.c:
#include <stdio.h>
#include "math.h" // 包含静态库的头文件
int main() {
printf("3 + 5 = %d\n", add(3, 5));
printf("8 - 2 = %d\n", sub(8, 2));
return 0;
}
2.2 编译并链接静态库
gcc main.c -L. -lmath -o main
gcc main.c -Llib/ -lmath -o a.out
-L.:指定库的搜索路径(.表示当前目录)。-lmath:链接libmath.a(注意省略lib和.a)。
2.3 运行程序
./main
输出:
./a.out
3+5=8
5-3=2
3. 验证静态库内容
查看静态库包含哪些目标文件:
ar -t libmath.a
输出:
add.o
sub.o
4. 常见问题
(1)undefined reference to 错误
- 原因:链接时未找到库或函数实现。
- 解决:
-
- 检查库路径是否正确(
-L/path/to/lib)。 - 确保库名拼写正确(
-lmath对应libmath.a)。
- 检查库路径是否正确(
(2)静态库与动态库冲突
- 如果同时存在
libmath.a和libmath.so,默认优先链接动态库。 - 强制使用静态库:
gcc main.c -L. -l:libmath.a -o main
(3)优化静态库
编译时添加优化选项(如 -O2):
gcc -c add.c -O2 -o add.o
gcc -c sub.c -O2 -o sub.o
5. 总结
|
步骤 |
命令示例 |
|
1. 编译目标文件 |
|
|
2. 打包静态库 |
|
|
3. 调用静态库 |
|
|
4. 运行程序 |
|
关键点:
- 静态库通过
ar工具打包.o文件生成。 - 链接时用
-L指定库路径,-l指定库名。 - 静态库会直接嵌入到可执行文件中,运行时无需额外依赖。
368

被折叠的 条评论
为什么被折叠?



