pybind与boost / dll-双重使用DLL? TL; DR 摘要最小示例 DLL项目文件 C ++测试代码 Python测试代码

问题描述

TL; DR

将pybind11绑定添加到正在运行的C ++ DLL项目中,使我可以在Python中导入并使用生成的DLL,但会破坏我使用boost / dll机制在C ++代码中使用它的能力。

摘要

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

省略了一些细节,但遵循此recipe,一切都很好。

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

因此,我尝试使用FooLibpybind11绑定添加PYBIND11_MODULE DLL项目中。

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

但是,当我在pybind绑定中进行编译时,boost / dll导入机制无法再加载原始的FooLib.dll。我用boost::dll::library_info()验证适当的CreateFoo符号已导出到DLL。但是使用boost::dll::import_alias()加载失败的原因是:

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的一个二进制文件

解决方法

@ n.'pronouns'm中的建议。评论是正确的。只需将我构建的Anaconda发行版中的python DLL复制到C ++程序的运行目录即可解决此问题。回想起来很有意义,但我没有想到。

使我更有可能将构建分开,或者至少将我的真实项目设置为仅在计算机上使用pybind绑定进行构建。