我正在读一本描述静态图书馆和共享库的教科书。有两个源文件,addvec.c
和multvec.c
,为了创建它们的静态库,我们将按照以下方式使用ar工具:
linux> gcc -c addvec.c multvec.c
linux> ar rcs libvector.a addvec.o multvec.o
因此,基本上,它只需先创建可重定位的对象文件( .o ),然后与这些.o文件一起使用ar工具。
但是,如果我们想构建一个共享库libvector.so,那么这本书中的命令是:
linux> gcc -shared -fpic -o libvector.so addvec.c multvec.c
注意,我们直接使用源文件(.c)作为参数,而不是重新定位对象文件。
那么,为什么共享库不需要生成可重定位的对象文件并直接使用源文件,这与使用可重定位对象文件的静态链接不一致?
发布于 2020-09-02 09:16:12
您可以单独构建共享库的组件对象:
gcc -fpic -c addvec.c multvec.c
gcc -shared -fpic -o libvector.so addvec.o multvec.o
但是,请注意,所有编译和链接步骤都必须使用相同的标志。我怀疑这是你教科书中使用的方法背后的主要原因。静态库不需要独立于位置的代码,但是共享库需要。共享库不是两次显式地构建单个对象文件,也不是在静态库上“浪费”PIC,而是使用源文件中的PIC构建共享库。
https://unix.stackexchange.com/questions/607479
复制相似问题