TL;DR
向正在运行的Python项目添加pybind11绑定允许我在C++中导入和使用生成的DLL,但无法使用boost/dll机制在C++代码中使用它。
摘要
我有一个编译成FooLib.dll的C++库。我使用boost/dll的BOOST_DLL_ALIAS和boost::dll::import_alias()导出并加载一个Foo类,该类在其他C++代码中执行一些工作。
虽然省略了一些细节,但遵循这个recipe,一切都很好用。
我希望能够从Python中调用相同的库代码来执行一些复杂的功能测试,并与numpy/scipy原型进行比较,而不必用C++编写如此多的测试代码。
因此,我尝试使用PYBIND11_MODULE将pybind11绑定添加到FooLib 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的二进制文件呢?
发布于 2020-08-14 07:50:37
@n.‘pronouns’m.Comment中的建议是正确的。简单地将我构建的Anaconda发行版中的python DLL复制到C++程序的运行目录就可以解决这个问题。回想起来是有道理的,但我没有想到。
这使得我更有可能将构建保持分离,或者至少将我的实际项目设置为只在我的机器上使用pybind绑定进行构建。
https://stackoverflow.com/questions/63401931
复制相似问题