【发布时间】:2021-11-23 20:53:38
【问题描述】:
我正在开发一个支持 Python 扩展的程序,并注意到如果用户的机器中没有 Python 或使用 x64 版本而不是 x32 版本,它不会打开。 (我无法更改最后一部分,因为它不取决于我)。
所以我一直在阅读延迟加载以稍后检查库是否可用并这样做:
// linker: /DELAYLOAD:python3.dll
#include <delayimp.h>
#include <Python.h>
#pragma comment(lib, "delayimp")
#pragma comment(lib, "python3")
...一切正常,直到工作室给我这个问题:
由于导入数据符号,LNK1194 无法延迟加载“python3.dll” '__imp__PyType_Type';没有 /DELAYLOAD:python3.dll 的链接
所以我的问题是:这个问题有解决方法吗?
我一直在考虑从他们的 GitHub 页面编辑包含并直接在我的程序中定义 PyType_Type 但我害怕破坏某些东西......
谢谢。
【问题讨论】:
-
我认为不可能,因为那不是函数。真正的问题是你为什么需要这种行为?似乎是一个 XY 问题。一种方法是动态加载 .dll(但您必须重新定义类型和函数)。
-
我需要它来支持“.py”扩展。我们应该运行一个解释器实例,为此需要链接 python3.dll。是的,进行动态加载似乎是一个不错的方法,但我对 PyType_Type 有点担心,因为我对导入数据类型了解不多。
-
很明显,您需要一些 Python 功能,否则不需要与 python3.lib 链接。我的问题是为什么要延迟加载?
-
啊好吧!因为否则,如果系统上没有 python,并且它是一个可选功能,那么整个事情都会关闭......我想延迟加载检查 dll 是否存在,然后启用它。
-
嗯,可能有办法。将 python.lib 链接到一个 .dll,它公开了一个(简单的)API,并且只(尝试)在您需要时动态加载它访问 Python 功能。
标签: python c++ visual-studio dll cpython