生成动态库的核心命令是gcc -shared -fPIC -o libxxx.so xxx.o:-shared指定生成共享对象,-fPIC生成位置无关代码,二者缺一不可;命名须为libxxx.so格式,且必须基于已加-fPIC编译的.o文件。

gcc -shared -fPIC -o libxxx.so xxx.o 是生成动态库最核心、不可省略的命令形式。
gcc -shared -fPIC 缺一不可
-shared 告诉 gcc 当前要生成的是共享对象(即动态库),不是可执行文件或静态库;省略它会报错或生成错误类型文件。-fPIC 表示“位置无关代码”(Position Independent Code),这是动态库在运行时能被加载到任意内存地址的前提;没加它,.so 文件可能编译成功,但链接或运行时报 relocation R_X86_64_32S against `xxx' can not be used when making a shared object 类错误。
常见错误现象:
- 只用
gcc -shared -o libmy.so my.o→ 报 relocation 错误 - 用
gcc -c -fPIC my.c但漏了-shared→ 生成的是.o,不是.so
动态库命名必须带 lib 前缀和 .so 后缀
例如函数实现在 hello.c,对应目标文件是 hello.o,那么推荐写成:gcc -shared -fPIC -o libhello.so hello.o
不推荐:gcc -shared -fPIC -o hello.so hello.o(链接时 -lhello 会找不到)
多个 .o 文件一起打包也一样处理
比如有 sub1.o、sub2.o、sub3.o:gcc -shared -fPIC -o libsub.so sub1.o sub2.o sub3.o
不需要提前用 ar,ar 是给静态库用的。
注意:不能直接用源文件(.c)代替 .o
gcc -shared -fPIC -o libhello.so hello.c 虽然有时能过,但隐含调用了 -c,行为不稳定;显式分步更可控:
- 先
gcc -c -fPIC hello.c -o hello.o - 再
gcc -shared -fPIC -o libhello.so hello.o
真正容易被忽略的是:即使你只改了一行 .c,也要重新生成 .o 再重做 -shared 步骤——因为 -fPIC 必须作用于目标文件阶段,不能事后补。











