【发布时间】:2020-05-21 04:05:06
【问题描述】:
这是我的用例:我正在多个平台上构建 Python 轮子,其中包含链接到 Boost 的已编译二进制扩展。我需要将相关的 Boost DLL(和其他一些)与轮子捆绑在一起,但我想避免 DLL 地狱。在 MacOS 和 Linux 上,我可以分别使用 'delocate' 和 'auditwheel' 干净地完成此任务。在 Windows 上,我有点不知所措。
我想做的(但不知道该怎么做)是更改二进制扩展名(本身是一个 DLL)中的 DLL 名称,因此它会寻找 boost_filesystem_blargle.dll 而不是 boost_filesystem.dll 哪里 ' blargle' 是随机确定的,因此是唯一的。然后,我将 boost_filesystem.dll 包含在名称 boost_filesystem_blargle.dll 下,并且没有冲突的可能性。
我试图避免延迟加载等需要更改我正在使用的库的源代码的事情——这需要作为构建后的步骤来操作。此外,一些 DLL 导出类,这似乎完全延迟了加载。
这在 Windows 上是否可行?
【问题讨论】:
-
您可以为依赖项创建程序集。 DLL 可以具有声明依赖程序集的#2 清单。 SxS 融合加载器在加载 DLL 时创建一个激活上下文,它唯一地引用程序集中的文件。无需重命名任何 DLL。
-
DLL 可以有自己的 SxS 程序集吗?在这种情况下,应用程序本身就是 Python 解释器。更具体地说: - 我用 Python 编写 mylibrary.py,它加载 mylibrary_extensions.dll - 我从 C++ 代码编译 mylibrary_extensions.dll 并将其与 mylibrary.py 一起分发 - mylibrary_extensions.dll 链接到 boost_whatever.dll
标签: windows dll linker python-wheel