必须加 -fpic,否则链接报错;需同时提供头文件、.so 文件及 pkg-config 文件,并配置编译、链接和运行时路径。

clang++ -shared 生成 .so 文件必须加 -fPIC
不加 -fPIC 会报错:relocation R_X86_64_32 against symbol ... can not be used when making a shared object。因为动态库在加载时地址不确定,所有代码必须位置无关。
正确做法是:先用 clang++ -c -fPIC 编译每个 .cpp 文件为 .o,再用 clang++ -shared 打包:clang++ -c -fPIC MyClass.cpp -o MyClass.oclang++ -shared -o libmyclass.so MyClass.o
头文件和库文件怎么一起给对方用
只扔一个 libmyclass.so 没用——调用方编译时找不到函数声明,链接时也找不到符号。
必须同时提供:
• 头文件(如 MyClass.h),放在 include/ 目录下
• 动态库文件(libmyclass.so),放在 lib/ 目录下
• 可选但强烈建议:一个 pkg-config 文件(myclass.pc),方便对方用 pkg-config --cflags --libs myclass 获取编译/链接参数
Clang 22.1.3 Windows 64 位历史版本安装包,适合旧项目兼容、LLVM/Clang 工具链回退、编译行为对比、链接问题复现和 C/C++ 构建环境维护。
别人用你的 .so 时常见链接失败原因
典型错误:undefined reference to `MyClass::func()' 或 error while loading shared libraries: libmyclass.so: cannot open shared object file
根本原因不是代码写错,而是环境没配对:
• 编译时漏了 -I/path/to/include,导致头文件找不到,函数声明缺失
• 链接时漏了 -L/path/to/lib -lmyclass,或 -lmyclass 写成 -lMyClass(名字必须匹配 libxxx.so 中的 xxx)
• 运行时系统找不到 .so:Linux 默认只查 /usr/lib 和 /lib,需临时设 LD_LIBRARY_PATH=/path/to/lib,或永久写进 /etc/ld.so.conf.d/myclass.conf 后运行 sudo ldconfig
macOS 上对应的是 .dylib,不是 .so
Clang 在 macOS 默认生成 .dylib,不是 .so。命令一样,但后缀和路径逻辑不同:clang++ -shared -o libmyclass.dylib MyClass.o
用户运行时若报 Library not loaded: @rpath/libmyclass.dylib,说明没设好运行时路径。要用 install_name_tool 改 LC_ID_DYLIB 和依赖路径,再用 otool -L 验证;否则即使编译通过,一运行就崩。
pkg-config 文件或清晰的 README,而不是代码本身。










