如何在cppyy中加载库?
Posted
技术标签:
【中文标题】如何在cppyy中加载库?【英文标题】:how to load library in cppyy? 【发布时间】:2020-06-03 11:53:13 【问题描述】:我正在尝试使用 python 中的 cppyy 来导入 C++ 文件。我想加载 HSMdApi.h 和 HSMdApi.lib。这是目录结构
这里是代码
import cppyy
cppyy.include('include/HSMdApi.h')
cppyy.load_library('win64/HSMdApi.lib')
我成功加载了头文件。但是当我加载库时,我得到了一个错误
Error in <TWinNTSystem::DynamicPathName>: win64/HSMdApi.lib does not exist in [a list of environment PATH] or has wrong file extension (.dll)
如果我删除 .lib,我会遇到另一个错误。
cppyy.load_library('win64/HSMdApi')
>> cling::DynamicLibraryManager::loadLibrary(): LoadLibrary: returned 126: The specified module could not be found.
我用的是win10 64bit,AMD64bit,用Anaconda3安装cppyy,python 3.7。我记得在 cppyy 安装期间有一个关于“bdist_wheel”的警告。
Command "bdist_wheel" is disabled
WARNING: Legacy build of wheel for 'cppyy' created no files.
Command output:
Command "bdist_wheel" is disabled
我猜有一些设置问题。由于 cppyy 很新,我找不到类似的问题。 感谢您的帮助。
【问题讨论】:
【参考方案1】:要加载的库是(动态).dll,而不是(静态).lib 库。您无需指定扩展名,因为如果未提供,则会添加该扩展名。 python 可执行文件是否也使用了 64 位(交互启动 python 时在欢迎消息中打印构建)? bdist_wheel 警告可以忽略(***被禁用 b/c pip 不遵守需求依赖顺序,但正常构建会这样做,因此如果为安装而不是***构建则很好)。
load_library
是ctypes.CDLL
的更便携版本,您也可以尝试,因为它可能会提供更好的错误消息。对于CDLL
,您确实需要指定完整路径。示例:
import ctypes, os
l = ctypes.CDLL(os.path.join('win64', 'HSMdApi.dll'))
综上所述,以上假设问题出在HSMdApi.dll
的加载上,但这不应该涉及紧贴或模块。运行脚本的目录中是否有字典残留?或者通过PATH
envar 访问的.rootmap
文件指向已被删除的库?
【讨论】:
谢谢。我使用python3.7 64位。我将 lib 文件夹设置为 PATH。我会尝试其余的。以上是关于如何在cppyy中加载库?的主要内容,如果未能解决你的问题,请参考以下文章
无法在 play-games-plugin-for-unity 中加载库 libgpg.so