微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一个程序使用的多个共享库可以使用不同的静态链接库吗?

如何解决一个程序使用的多个共享库可以使用不同的静态链接库吗?

在 Windows 上可以这样做(虽然不推荐,因为在不同的 c 库实例之间传递 c 标准库对象可能会出现问题),例如 this

每个可执行映像(EXE 或 DLL)都可以有自己的静态链接 CRT,或者可以动态链接到 CRT。特定图像中静态包含或动态加载的 CRT 版本取决于构建它的工具和库的版本。单个进程可能加载多个 EXE 和 DLL 图像,每个图像都有自己的 CRT

这可以在 Linux 上完成吗

this 是假的吗?但是像Linux这样的一般系统不应该有这样的限制吧?例如,如果代码库 A 和代码库 B 确实需要不同版本的 libc 才能正常工作,并且假设它们都为客户端提供非常简单的 C 风格 API(即这些 API 中没有指针参数),该怎么办?

如果不可能,则无需阅读以下内容

作为实现这一目标的第一步,当我尝试使用静态链接的 libc 构建共享库时:

    SRI       MP_START  MP_END  TRUCK_PCT
0   17031021__  0.00    0.100   
1   03291236__  0.00    0.050
2   200006165__ 0.00    0.120
3   00000009__  52.36   52.394
4   00000009__  51.78   52.360   7%
5   00000009__  49.09   51.780   7%
6   00000009__  48.76   48.760
7   00000015__  15.45   15.480   7%

解决方法

这可以在 Linux 上完成吗?

理论上:是的。在实践中:没有。

Linux 上可用的 libc 版本均不支持在单个进程中拥有库的多个副本。

此外,与 Windows DLL 相比,UNIX 和 Linux 使用非常不同的链接模型。

在 Windows 下,DLL 是一个自包含单元——只有从它显式导出的函数和变量从外部可见,调用 DLL 中定义的函数将总是导致调用那个函数(无符号插入)。

在 UNIX 模型下,共享库中的所有内容默认都是导出的,调用在同一库中定义的函数可能会也可能不会在运行时解析为该函数。

如果代码库 A 和代码库 B 确实需要不同版本的 libc 才能正常工作,该怎么办

libc 提供了一个标准接口。如果 A 需要一个 特定 版本的 libc 才能正常工作,那么它就坏了。 UNIX 理念是您应该修复 AB(或两者)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。