pybind with boost/dll - dual use DLL?



TL;DR

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

摘要

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

省略了一些细节,但按照这个食谱,一切都很好。

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

因此,我尝试使用PYBIND11_MODULE将pybind11绑定添加到FooLibDLL项目中。

它编译后,我得到了一个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可执行文件和编译增强的东西并不是最小的,但我在这里尽了最大努力:

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

直接链接到源文件:

DLL项目文件

HelloSayerLib.h

HelloSayerImp.cpp

C++测试代码

HelloSayerLibCppTest.cpp

Python测试代码

HelloSayerLibPythonTests.py

下一步有什么建议吗?

有可能编译成一个既适用于C++又适用于Python的二进制文件吗?

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

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

最新更新