我读过一本介绍静态库和共享库的教科书。有两个源文件addvec.c
和multvec.c
,要创建它们的静态库,我们将使用 ar 工具,如下所示:
linux> gcc -c addvec.c multvec.c
linux> ar rcs libvector.a addvec.o multvec.o
所以基本上它只是首先创建可重定位目标文件(.o),然后将 ar 工具与这些 .o 文件一起使用。
但如果我们想构建一个共享库 libvector.so 那么书中的命令是:
linux> gcc -shared -fpic -o libvector.so addvec.c multvec.c
请注意,我们直接使用源文件 (.c) 作为参数,而不是可重定位目标文件。
那么为什么对于共享库来说,不需要产生可重定位目标文件而直接使用源文件,这与使用可重定位目标文件的静态链接相比不一致呢?
答案1
你能分别构建共享库的组件对象:
gcc -fpic -c addvec.c multvec.c
gcc -shared -fpic -o libvector.so addvec.o multvec.o
但请注意,所有编译和链接步骤必须使用相同的标志。我怀疑这是您教科书中使用的方法背后的主要原因。静态库不需要位置无关的代码,但共享库需要。共享库是使用源文件中的 PIC 构建的,而不是两次显式构建各个目标文件,或者在静态库上“浪费”PIC。