最简可行命令是:clang -fPIC -shared -o libfoo.so foo.c;必须加-fPIC生成位置无关代码,-shared指定生成动态库,命名需符合lib<name>.so规范,多文件需先编译为.o再统一链接。

clang 编译 C 文件生成 .so 动态库的关键命令
直接用 clang -shared 就能生成 Linux 下的 .so 文件,但必须确保源码导出符号、不带 main 函数,且所有依赖都已处理。不是加个 -shared 就完事。
最简可行命令是:
clang -fPIC -shared -o libfoo.so foo.c
-
-fPIC必须加:动态库要求位置无关代码,漏掉会报错relocation R_X86_64_32 against symbol -
-shared是核心开关,缺它 clang 默认生成可执行文件 -
libfoo.so命名建议带lib前缀和.so后缀,否则ldd或-lfoo链接时可能找不到
多个 C 文件怎么一起编译成一个 .so
不能逐个 clang -shared,得先编译为对象文件,再统一链接。否则会报 cannot mix relocatable and shared objects。
正确流程:
Clang 22.1.3 Windows 64 位历史版本安装包,适合旧项目兼容、LLVM/Clang 工具链回退、编译行为对比、链接问题复现和 C/C++ 构建环境维护。
clang -fPIC -c a.c b.c -o a.o b.o<br>clang -shared -o libab.so a.o b.o
-
-c生成.o,避免 clang 尝试链接main - 所有参与动态库的源文件都必须用
-fPIC编译,哪怕只有一处没加,链接时也可能失败 - 如果某
.c文件里定义了static函数或变量,它们不会被导出,外部调用不到——这是设计行为,不是 bug
如何让函数真正能被外部调用
默认情况下,C 函数是 extern 的,但如果你用了 static、或在头文件里写了 __attribute__((visibility("hidden"))),那函数就藏起来了。
导出控制要点:
- 确保函数声明没加
static,定义也没加static - 避免全局加
-fvisibility=hidden(除非你明确用__attribute__((visibility("default")))标记要导出的函数) - 验证是否导出:用
nm -D libfoo.so查看动态符号表,看到T或U开头的函数名才算成功暴露
链接时找不到 libxxx.so 怎么办
运行时报 error while loading shared libraries: libfoo.so: cannot open shared object file,不是编译问题,是运行时路径没配对。
- 临时解决:运行前设
LD_LIBRARY_PATH=/path/to/dir:$LD_LIBRARY_PATH - 永久解决:把路径写进
/etc/ld.so.conf.d/foo.conf,再跑sudo ldconfig - 注意:
gcc或clang编译可执行文件时加-L/path -lfoo只影响编译期链接,不改变运行时搜索路径
动态库路径这事,编译时不管用,得靠系统 loader 找得到才行——这点最容易被当成“编译没成功”去反复折腾。

















