问题描述
TL; DR
将pybind11绑定添加到正在运行的C ++ DLL项目中,使我可以在Python中导入并使用生成的DLL,但会破坏我使用boost / dll机制在C ++代码中使用它的能力。
摘要
我有一个可以编译为FooLib.dll
的C ++库。我使用boost/dll的BOOST_DLL_ALIAS
和boost::dll::import_alias()
导出并加载一个类Foo
,该类在其他C ++代码中可以完成某些工作。
省略了一些细节,但遵循此recipe,一切都很好。
我希望能够从Python调用相同的库代码来进行一些复杂的功能测试,并与numpy/scipy
原型进行比较,而不必在C ++中编写太多的测试代码。
因此,我尝试使用FooLib
将pybind11绑定添加到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项目文件
C ++测试代码
Python测试代码
对下一步有什么建议吗?
是否有可能像这样编译成适用于C ++和Python的一个二进制文件?
解决方法
@ n.'pronouns'm中的建议。评论是正确的。只需将我构建的Anaconda发行版中的python DLL复制到C ++程序的运行目录即可解决此问题。回想起来很有意义,但我没有想到。
使我更有可能将构建分开,或者至少将我的真实项目设置为仅在计算机上使用pybind绑定进行构建。