如何在cppyy中加载库?

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

我正在尝试用python中的cppyy来导入C++文件,我想加载HSMdApi.h和HSMdApi.lib。我想加载HSMdApi.h和HSMdApi.lib。下面是目录结构

enter image description here

以下是代码

import cppyy
cppyy.include('include/HSMdApi.h')
cppyy.load_library('win64/HSMdApi.lib')

我成功地加载了头文件。但是当我加载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,安装了cppyy和Anaconda3,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很新,我找不到类似的问题。感谢您的帮助。

c++ c++14 python-3.7 cppyy
1个回答
0
投票

要加载的库是(动态).dll,而不是(静态).lib库。您不需要指定扩展名,因为如果没有提供扩展名,它就会被添加。使用的python可执行文件是否也是64位的(当交互式启动python时,构建的文件会在欢迎信息中打印)?bdist_wheel警告可以忽略(轮子是被禁用的,因为pip不尊重需求的依赖顺序,但普通的构建是尊重的,因此如果为安装而不是为轮子构建,就没有问题)。

load_library 是为了成为更便携的 ctypes.CDLL 你也可以尝试一下,也许这样能得到更好的错误信息。对于 CDLL你需要指定完整的路径。例子。

import ctypes, os
l = ctypes.CDLL(os.path.join('win64', 'HSMdApi.dll'))

说了这么多,以上假设问题出在加载的 HSMdApi.dll但这不应该涉及到cling或模块。你在运行脚本的目录中是否有字典残余?或者 .rootmap 的文件。PATH envar,指向后来被删除的库?

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