静态库文件名必须为libxxx.a格式,由ar工具将.o文件归档生成;链接时需用-L指定路径、-l指定库名(自动补lib和.a),且依赖顺序不能颠倒;头文件需单独用-I指定,函数不可声明为static,可用nm验证符号导出。

静态库文件名必须带 lib 前缀和 .a 后缀
Clang 本身不直接生成“静态库”,它只编译目标文件(.o),真正打包成静态库靠的是 ar 工具。如果你用 clang -c 编译出 utils.o,下一步得手动归档:
ar rcs libutils.a utils.o。注意:名字必须是
libxxx.a 格式,否则链接时 -lutils 会找不到——Clang(和 ld)默认只认这种命名约定。
-L 和 -l 要配对用,顺序不能反
链接时写成 clang main.c -L. -lutils 才有效。其中:
-
-L.告诉链接器去当前目录找库(路径必须存在且有读权限) -
-lutils是让链接器去找libutils.a(自动补前缀和后缀) - 顺序很重要:库依赖必须出现在被依赖代码之后,比如
main.o依赖libutils.a,就得写成main.o -L. -lutils,反过来会报undefined reference
头文件路径和符号可见性要分开处理
静态库只提供符号定义,不包含头文件。你得额外用 -I 指定头文件位置:
clang -I./include main.c -L. -lutils。另外,确保库中函数不是
static 的,否则链接时不可见;C++ 还要注意 name mangling,如果用 C++ 编译但头文件没加 extern "C",链接时也会找不到符号。
用 nm -C libutils.a 快速验证符号是否导出
链接失败时别急着改命令,先确认库真有你要的符号:
nm -C libutils.a | grep my_function。如果没输出,说明:
- 源码里函数被声明为
static - 编译时加了
-fvisibility=hidden且没显式标记__attribute__((visibility("default"))) - 目标文件根本没被放进
ar归档(比如拼错文件名)
libxxx.a 少个 lib,或 -L 指向空目录,错误信息都一样:「cannot find -lxxx」。多跑一次 ls -l 和 nm 比反复改链接命令快得多。


















