如果我在 Visual Studio 中链接两个提供相同符号的不同库会发生什么?

问题描述 投票:0回答:1

背景:我的 Windows 机器上安装了 Python 3.11 和开发源。相关的二进制文件是

  • python3.dll
  • python311.dll

二进制 python3.dll 实现了 python311.dll 的子集。受限制的 python3.dll 旨在为 Python 扩展开发人员提供跨 Python 版本的稳定 API。 Python 文档指示开发人员链接其中之一。

当我有自己的二进制文件从

#include <Python.h>
调用代码并链接到 both 导入库 python3.lib 和 python311.lib 时,Windows/MSVC 生态系统中会发生什么?具体来说,链接器命令包括

link.exe
...
.../libs/python311.lib
.../libs/python3.lib

我实际上已经尝试过这个并且链接成功,没有错误。我很惊讶,因为我预计会出现重复的符号定义错误。生成的二进制文件运行时没有任何可察觉的问题。

这在 Python 情况下以及一般情况下都可以吗?在 Python 案例中,我碰巧知道 python3.dll 通过使用依赖项应用程序手动期待导出表,通过“转发导出”到 python311.dll 来实现符号。看截图,这实际上是Python 3.12的python3.dll,因为我最近升级了我的Python。

python-3.x windows visual-c++ dll
1个回答
0
投票

...
  • C:\Python311
  • C:\Python310
  • ...
  • 然后,当启动程序时,
C:\Python310\python310.dll

将按预期加载,但将加载

C:\Python311\python3.dll
而不是
C:\Python310\python3.dll
,因为前者首先出现在路径中。然后,该 python3.dll 会将对其进行的调用转发给
C:\Python311\python311.dll
接下来,如果Python通过

Py_InitializeFromConfig()

初始化,这将发生在python310.dll中(因为它是稳定API的一部分)。但是,对

属于
稳定 API 的一部分且期望初始化嵌入式 Python(例如PyImport_ImportModule())的函数的调用将会失败,可能会出现访问冲突。据我了解,这是因为 python310.dll 和 python311.dll 各自具有独立的内部状态,并且该状态尚未在 python311.dll 中初始化。
    

© www.soinside.com 2019 - 2024. All rights reserved.