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