代码示例:1.1.3 静态库与动态库
全部示例均标注编译命令、适用环境与实测状态;完整验证记录见《03.5-代码编译运行验证记录》。
examples/add.c · 库源码 add.c(int add(int,int))
/* add.c —— 库源码(1.1.3 ex1/ex2/ex3 共用) * 适用环境:Linux / Windows(MinGW) 标准:C99+ * 编译(目标文件):gcc -c add.c -o add.o -std=c11 -Wall -Wextra -Wpedantic * 说明:这是"被做成库"的源码——只有加法函数、没有 main; * 不能直接运行,要先编译成目标文件 add.o(ex1),再打包进库(ex2/ex3)。 */ int add(int a, int b) { return a + b; }examples/main.c · 静态库全链路:add.o → ar rcs libadd.a → -L. -ladd → app
/* main.c —— 使用静态库的调用方(1.1.3 ex2) * 适用环境:Linux / Windows(MinGW) 标准:C99+ * 完整链路(本机实测,三处命令一致): * gcc -c add.c -o add.o -std=c11 -Wall -Wextra -Wpedantic * ar rcs libadd.a add.o * gcc main.c -L. -ladd -o app -std=c11 -Wall -Wextra -Wpedantic * 运行:app.exe(Windows)/ ./app(Linux) * 说明:规范做法是把 add 的声明放进头文件;这里手写声明, * 用于演示"链接"如何把 main 与库里的 add 符号接上。 */ #include <stdio.h> int add(int a, int b); int main(void) { printf("%d + %d = %d\n", 3, 4, add(3, 4)); return 0; }examples/ex3-shared-steps.txt · Linux 动态库命令序列(.so 制作→链接→运行路径三方案)
# 1.1.3 ex3 Linux 动态库命令序列(按顺序在 Linux 终端执行) # 本机无 Linux,未执行;命令按 GCC 官方手册与 ld.so(8) 文档核对 # —— 第 1 步:制作动态库(-fPIC 位置无关代码 + -shared 生成共享库)—— gcc -fPIC -shared add.c -o libadd.so # —— 第 2 步:链接使用(-L. 指定库搜索路径、-ladd 对应 libadd.so)—— gcc main.c -L. -ladd -o app # —— 第 3 步:运行前告诉动态链接器去哪找库 —— # 方案一(临时):环境变量必须写全 LD_LIBRARY_PATH(资料原文漏 PATH 后缀,见勘误 err-7.1-2) export LD_LIBRARY_PATH=$PWD ./app # 期望输出:3 + 4 = 7 # # 方案二(系统级):把库路径写入 /etc/ld.so.conf.d/*.conf,再执行 sudo ldconfig # 方案三(约定路径):把库安装到 /usr/local/lib(默认搜索路径之一),再执行 sudo ldconfig # # 说明:Windows 上 gcc -shared 生成的是 DLL(如 libadd.dll),机制与 .so 不同(见本章迁移训练); # 排查动态库缺失问题可用 ldd ./app(Linux)查看实际解析到的库路径。