1. 项目概述
在Linux系统开发中,库文件是代码复用和模块化开发的核心载体。作为C/C++开发者,我们每天都在使用各种库,但很少有人真正理解它们的内部机制。这次我想通过一个完整的实践项目,带大家从零开始构建动静态库,并深入分析它们的工作原理。
我最初接触库文件时也犯过不少错误:链接时找不到符号、版本不兼容、ABI冲突等问题层出不穷。后来通过反复实践和阅读源码,终于摸清了其中的门道。本文将分享这些实战经验,从最基本的.o文件开始,逐步构建完整的动静态库,并分析它们在编译、链接、加载各阶段的差异。
2. 编译单元与目标文件解析
2.1 从源码到.o的编译过程
我们先准备三个简单的源文件作为示例:
c复制// math_utils.h
#pragma once
int add(int a, int b);
int sub(int a, int b);
// math_utils.c
#include "math_utils.h"
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
// print_utils.h
#pragma once
void print_result(int res);
// print_utils.c
#include <stdio.h>
#include "print_utils.h"
void print_result(int res) {
printf("Result: %d\n", res);
}
// main.c
#include "math_utils.h"
#include "print_utils.h"
int main() {
print_result(add(10, 20));
return 0;
}
使用gcc编译为目标文件:
bash复制gcc -c math_utils.c -o math_utils.o
gcc -c print_utils.c -o print_utils.o
注意:-c参数表示只编译不链接,生成可重定位目标文件(Relocatable Object File)
