TL;DR
将pybind11绑定添加到正在工作的C++DLL项目中,可以在Python中导入和使用生成的DLL,但破坏了我使用boost/DLL机制在C++代码中使用它的能力。
摘要
我有一个C++库,我把它编译成FooLib.dll
。我使用boost.dll的BOOST_DLL_ALIAS
和boost::dll::import_alias()
导出并加载一个类Foo
,该类在其他C++代码中做一些工作。
省略了一些细节,但按照这个食谱,一切都很好。
我希望能够从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可执行文件和编译增强的东西并不是最小的,但我在这里尽了最大努力:
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绑定进行构建。