我有一个用 C++ 编写的 dll,我想将它导出到 Python 以运行回归和单元测试(使用 Python 更容易维护和运行回归)。为此,我想使用 Boost.Python 导出 dll 的主要 API,以便它可以在 Python 中使用。我的程序集如下所示:
- MyLibrary.dll //主 API C++ 库
- MyLibrary.pyd //一个只包含导出定义的瘦 dll 项目
BOOST_PYTHON_MODULE
(依赖于 MyLibrary.dll) - ... //MyLibrary.dll 所依赖的其他 C++ dll 文件
我在让 MyLibrary.pyd 链接时遇到了一些麻烦,但是在稍微研究了一些问题之后(例如这里b2.exe
),我意识到我必须在指向我的特定 Python 版本时重新构建 boost 。之后,我能够从 python 导入和运行我的库(仅在我的机器上)。
技术数据:我在 Windows 7 x64 和 MSVC-10.0 上使用 boost 1.51、Python 3.23 构建库(我自己的项目是从 VS2010 构建的)。我用来链接 boost 的变体是共享库,64 地址模型,用我自己的构建相应地发布。
问题是,当我尝试在另一台机器上导入库(在我的机器上构建)时,python 抱怨:
ImportError: DLL load failed: The specified procedure could not be found.
在线上import MyLibrary
这引出了以下问题:
- 我在我的机器上构建的 MyLibrary.pyd 是“python-portable”吗?意思是,除了 3.23(我用来在我的机器上构建 boost.python 的版本)之外,它还能在其他版本的 Python 上工作吗?
- MyLibrary.pyd 的用户是否必须使用他自己的 python 版本重新构建 boost 才能成功导入它?
- 到目前为止,我们一直在使用 BoostPro 提供的 Windows 预构建的 boost 安装程序。构建链接的 Python 版本是什么?如果我们只是决定在整个团队中使用“正确”版本的 Python(BoostPro 链接的版本),我是否可以让我的用户免去自己构建 boost 的麻烦?