我有一个带有嵌入式 Python 的 C++ 应用程序。我已将所有 Python 文件放入 Libs 目录中,该目录是我的
application.exe
根目录的子目录。
为了加载 Python,我需要将
python310.dll
移动到与我的 application.exe
并排,而不是在 Libs
中。
python310.dll
与Python其余部分的分离导致了其他问题,所以我希望它在Libs\python310.dll
中。
我创建了一个
application.exe.manifest
:
<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
type="win32"
name="Sampler"
version="2.99.0.0"
processorArchitecture="*"/>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="python310"
version="3.10.11150.1013"
processorArchitecture="x86"/>
</dependentAssembly>
</dependency>
<file name=".\Libs\python310.dll"/>
</assembly>
但是,这行不通。运行
sxstrace
,我收到错误 ERROR: Cannot resolve reference python310,processorArchitecture="x86",type="win32",version="3.10.11150.1013".
应用程序无法启动,因为它找不到 python310.dll
。
是否可以使用清单从子目录加载 DLL?
一些建议。
建议#1。当所有 DLL 和 EXE 都位于同一目录中时,这是最简单的。那么你“通常”不需要清单文件 - 至少对于本机代码不需要。问问自己 - 如果代码正常运行,最终用户是否关心所有 python、DLL 和 EXE 文件是否都在同一目录中?因此,请考虑将“lib”和“application”目录合并为一个目录。 建议#2。将您的 EXE 分成两个二进制文件:一个存根 exe 和一个 DLL,大部分代码都链接到其中。 Application.exe 只是一个存根可执行文件,其唯一工作是在运行时调用
SetDllDirectory("c:\path o pp\ \lib" ,后跟 LoadLibrary("application.dll")
链接到 lib 目录中的所有 Python 内容然后
GetProcAddress
获取从此 DLL 导出的特殊 main
函数。现在,您的本机应用程序代码将默认根据需要搜索 DLL 的 lib 路径,因为您已经以编程方式调用了 SetDllDirectory。