GCC编译静态库的-fPIC选项
背景
通常在linux下用gcc编译动态库时都会加上一个-fPIC
选项来生成位置无关代码,但是从来没有人明确的说过是不是要在编译静态库时也加上-fPIC
选项。我在这篇文章中就给出一个明确的结论并讲述原理。
介绍-fPIC
的原理的文章网上汗牛充栋这里不再赘述。
原理分析
众所周知,静态库其实是一系列.o文件的打包,将.o文件制作成静态库的过程是不会发生链接的。
所以链接静态库就约等于将静态库解包后的.o文件一个一个全部链接。
-fPIC
选项的生效阶段在编译阶段,使用-fPIC
选项编译的.o文件会生成位置无关的代码
如果一个动态库需要链接一个静态库,那么就相当于动态库去链接一系列的.o文件,而编译动态库所需的.o文件时一般是推荐使用-fPIC
编译选项的。
结论
如果你的静态库可能会被动态库使用,那么静态库编译的时候就也需要-fPIC
选项。