首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pybind with boost/dll -双重使用DLL?

pybind with boost/dll -双重使用DLL?
EN

Stack Overflow用户
提问于 2020-08-14 03:21:57
回答 1查看 277关注 0票数 1

TL;DR

向正在运行的Python项目添加pybind11绑定允许我在C++中导入和使用生成的DLL,但无法使用boost/dll机制在C++代码中使用它。

摘要

我有一个编译成FooLib.dll的C++库。我使用boost/dllBOOST_DLL_ALIASboost::dll::import_alias()导出并加载一个Foo类,该类在其他C++代码中执行一些工作。

虽然省略了一些细节,但遵循这个recipe,一切都很好用。

我希望能够从Python中调用相同的库代码来执行一些复杂的功能测试,并与numpy/scipy原型进行比较,而不必用C++编写如此多的测试代码。

因此,我尝试使用PYBIND11_MODULEpybind11绑定添加到FooLib DLL项目。

它编译了,我得到了一个FooLib.dll。我可以将其复制并重命名为FooLib.pyd,然后将其作为Python模块导入,一切都很正常。我将Foo导出为Python类,它可以正常工作。

但是,当我在pybind绑定中编译时,boost/dll导入机制不能再加载原始的FooLib.dll。我使用boost::dll::library_info()验证是否已将适当的CreateFoo符号导出到DLL。但是使用boost::dll::import_alias()加载失败,出现以下错误:

代码语言:javascript
复制
boost::dll::shared_library::load() failed: The specified module could not be found

最小示例

不幸的是,需要C++和Python可执行文件并编译boost的东西并不是最小的,但我在这里尽了最大努力:

https://github.com/danzimmerman/pybind-boostdll-minimal

指向源文件的直接链接:

DLL项目文件

HelloSayerLib.h

HelloSayerImp.cpp

C++测试代码

HelloSayerLibCppTest.cpp

Python测试代码

HelloSayerLibPythonTests.py

对下一步有什么建议吗?

有没有可能编译成一个同时适用于C++和Python的二进制文件呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-14 07:50:37

@n.‘pronouns’m.Comment中的建议是正确的。简单地将我构建的Anaconda发行版中的python DLL复制到C++程序的运行目录就可以解决这个问题。回想起来是有道理的,但我没有想到。

这使得我更有可能将构建保持分离,或者至少将我的实际项目设置为只在我的机器上使用pybind绑定进行构建。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63401931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档