首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么静态库使用可重定位的对象文件而共享库使用源文件?

为什么静态库使用可重定位的对象文件而共享库使用源文件?
EN

Unix & Linux用户
提问于 2020-09-02 09:03:05
回答 1查看 520关注 0票数 0

我正在读一本描述静态图书馆和共享库的教科书。有两个源文件,addvec.cmultvec.c,为了创建它们的静态库,我们将按照以下方式使用ar工具:

代码语言:javascript
运行
复制
linux> gcc -c addvec.c multvec.c
linux> ar rcs libvector.a addvec.o multvec.o

因此,基本上,它只需先创建可重定位的对象文件( .o ),然后与这些.o文件一起使用ar工具。

但是,如果我们想构建一个共享库libvector.so,那么这本书中的命令是:

代码语言:javascript
运行
复制
linux> gcc -shared -fpic -o libvector.so addvec.c multvec.c

注意,我们直接使用源文件(.c)作为参数,而不是重新定位对象文件。

那么,为什么共享库不需要生成可重定位的对象文件并直接使用源文件,这与使用可重定位对象文件的静态链接不一致?

EN

回答 1

Unix & Linux用户

发布于 2020-09-02 09:16:12

您可以单独构建共享库的组件对象:

代码语言:javascript
运行
复制
gcc -fpic -c addvec.c multvec.c
gcc -shared -fpic -o libvector.so addvec.o multvec.o

但是,请注意,所有编译和链接步骤都必须使用相同的标志。我怀疑这是你教科书中使用的方法背后的主要原因。静态库不需要独立于位置的代码,但是共享库需要。共享库不是两次显式地构建单个对象文件,也不是在静态库上“浪费”PIC,而是使用源文件中的PIC构建共享库。

票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/607479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档