gpt4 book ai didi

python - 带有 boost/dll 的 pybind - 双重使用 DLL?

转载 作者:行者123 更新时间:2023-12-02 10:28:16 34 4
gpt4 key购买 nike

TL;博士
将 pybind11 绑定(bind)添加到工作中的 C++ DLL 项目允许我在 Python 中导入和使用生成的 DLL,但会破坏我使用 boost/dll 机制在 C++ 代码中使用它的能力。
概括
我有一个 C++ 库,可以编译为 FooLib.dll .我用 boost/dllBOOST_DLL_ALIASboost::dll::import_alias()导出和加载类 Foo这在其他 C++ 代码中有一些工作。
省略了一些细节,但一切都很好,遵循 recipe .
我希望能够从 Python 调用相同的库代码来进行一些复杂的功能测试并与 numpy/scipy 进行比较原型(prototype),而无需用 C++ 编写如此多的测试代码。
所以我尝试添加pybind11绑定(bind)到 FooLib使用 PYBIND11_MODULE 的 DLL 项目.
它编译,我得到一个 FooLib.dll .我可以将其复制并重命名为 FooLib.pyd ,将其作为 Python 模块导入,一切正常。我导出Foo作为一个 Python 类,它可以工作。
但是,当我在 pybind 绑定(bind)中编译时,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 中的建议。评论是正确的。只需将 python DLL 从我构建的 Anaconda 发行版复制到 C++ 程序的运行目录即可解决问题。回想起来很有道理,但我没有想到。
使我更有可能将构建分开或至少将我的真实项目设置为仅在我的机器上使用 pybind 绑定(bind)进行构建。

关于python - 带有 boost/dll 的 pybind - 双重使用 DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63401931/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com