我有一个 libsomething.a
文件,它是一个包含所有依赖项的静态库。
我需要能够在 Python 中导入它,因为它是一个 Python C 库。 According to this ,无法将静态库用作 CPython 库。
我怎样才能将我的 .a
文件变成 .so
,同时保留所有静态依赖项?
背景:我正在使用 Crowbar构建一个可以从 AWS Lambda 中的 Python 调用的 CPython 共享库。到目前为止,它一直运行完美,但是一旦我添加了需要 OpenSSL 的依赖项,我在 Lambda 中运行代码时就会遇到链接器问题。
此处的问题是用于执行代码的 Amazon Linux 镜像具有古老的 OpenSSL 版本。我有 recreated the runtime environment ,但问题是旧版本的 OpenSSL 不再存在于亚马逊的 yum 存储库中。这意味着安装 openssl-devel
会降低 OpenSSL 1.0.2k,其中在运行时提供的 OpenSSL 版本是 1.0.1。
这会导致 Lambda 中的运行时链接失败。因此,我需要一种方法来构建(大部分)静态链接的共享库。我希望我的 SO 从中链接的唯一共享库是 libc 和内核,以及静态编译的所有其他内容。
在Lambda执行环境中,LD_LIBRARY_PATH
设置为/usr/lib64:/lib64:./lib
,所以lib
中的任何东西> 文件夹将被加载,但只是作为最后的结果,如果我链接到 OpenSSL,我每次都会得到错误的版本。
在 Rust 中,我可以选择生成 liblambda.a
或 liblambda.so
,静态库或共享库。我假设生成一个 *.a
,然后转换成一个共享库,只链接到 glibc 和内核依赖项。
最佳答案
不,您不能进行从静态库到共享库的转换(至少在实践中不能)。阅读How To Write Shared Libraries由 Drepper 提供。
主要原因之一是共享库希望(它几乎需要)拥有 position independent code (静态库通常没有)。
然而,在 Linux 上大多数库都是 free software .那么,为什么不将您的库从源代码重新编译到共享库中呢?
(您可能会从源代码重新编译特定版本的 OpenSSL)
关于linux - 将静态库转换为动态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49262694/