pybind 与 boost/dll - 双用途 DLL?

pybind with boost/dll - dual use DLL?

TL;DR

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

总结

我有一个编译为 FooLib.dll 的 C++ 库。我使用 boost/dllBOOST_DLL_ALIASboost::dll::import_alias() 来导出和加载 class Foo,它在其他 C++ 代码中做一些工作。

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

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

所以我尝试使用 PYBIND11_MODULE.

pybind11 绑定添加到 FooLib DLL 项目

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

但是,当我在 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 绑定进行构建。