如何在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_libraryctypes.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

在salesforce闪存中加载库mapsjs-core和mapsjs-service时出错

使用cppyy时如何在python中创建子类?

cppyy 无法打开共享库

如何使用 cppyy 从指针索引类数组

cppyy - 如何调用接受集合的 c++ 函数?