Boost.Python 创建的 dll 无法导入(遵循 Boost Python 的 QuickStart)

Posted

技术标签:

【中文标题】Boost.Python 创建的 dll 无法导入(遵循 Boost Python 的 QuickStart)【英文标题】:The dll created by Boost.Python cannot be imported (following Boost Python's QuickStart) 【发布时间】:2017-05-24 14:49:13 【问题描述】:

我正在尝试按照说明 here 使用 Boost.Python。源代码在该网页中。我可以编译、链接这个简单的示例代码,但我无法在 python 命令行中导入生成的模块。它总是错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named hello_ext

我不知道这是怎么回事,因为该页面只是说:“就是这样。我们完成了。我们现在可以将其构建为共享库。生成的 DLL 现在对 Python 可见。”这是我的建筑环境:

Windows 7 64位,我是管理员,以管理员身份运行cmd boost版本为1.64.0(预编译二进制boost_1_64_0-msvc-14.0-64.exe下载自here) python版本是2.7.13,64位 Visual Studio 2015,更新 3 目标是一个 DLL 项目名称为ConsoleApplication1,所以输出为ConsoleApplication1.dll。我已将文件名更改为 hello_ext.dll 但同样的错误。 我使用 x64 配置构建,并使用 dumpbin 验证输出 ConsoleApplication1.dll 确实是 64 位 我已将包含 ConsoleApplication1.dll 的路径 ......\ConsoleApplication1\x64\Release 添加到 python 命令行中的 sys.path 中。

那么,你能告诉我如何在 python 中导入模块吗?非常感谢。

【问题讨论】:

省去所有这些麻烦,获取prebuilt binaries for Visual Studio 错误:x64 配置中的“未解析的外部符号 __imp_PyString_Type”。 x32 配置中出现大量“错误 LNK2001:无法解析的外部符号“__declspec(dllimport) ...”错误。 那些以__imp_ 开头的错误表明您没有在链接器设置中指定适当的导入库“.lib”文件。我在您的描述中没有看到任何内容表明您已告诉链接器将使用的导入库的名称。设置路径不会这样做,并且 DLL 在构建过程中没有任何作用——它们仅在运行时使用。预构建的二进制文件包括导入库(.lib 文件不是很大,与大小为兆字节的静态库相反)。 预编译二进制文件的 lib64-msvc-14.0 文件夹中只有两个与 Boost.Python 相关的 .lib 文件:boost_python-vc140-mt-1_64.lib 和 boost_python-vc140-mt-gd- 1_64.lib。我在 Property Pages->Linker->Input->Additional Dependencies 中添加了它们中的每一个(这是我在 VS 2015 中唯一能找到指定库文件的地方)。但是在 x64 配置中同样的错误(lib64-msvc-14.0 意味着目标是 64 位,所以不应该与 x86 配置一起使用,对吧?) python官网提供的默认下载是32位的(****,今天谁在用32位CPU?五年前我看到大家都用64位操作系统)。我重新安装了 64 位 python 2.7,现在没有链接错误。但是我仍然不知道如何在 python 命令行中导入 DLL。 【参考方案1】:

我自己解决了这个问题。感谢 jagerman 的有用建议。

(1) 只需将输出文件名从 ConsoleApplication1.dll 更改为 hello_ext.pyd。您可以通过将 Pages->General->Target Extension 设置为“.pyd”来自动重命名。确保文件 hello_ext.pyd 在 python 的搜索路径中。你可以把它扔到 C:\Python27\DLLs 这是 python 的内置搜索路径之一。

(2) 现在你会得到一个不同的导入错误:DLL load failed: The specified module could not be found。如果您仔细查看 hello_ext.pyd 的文件大小,您可能会注意到一些连线——它只有 19KB。这意味着它不包含导入 python 所需的所有内容,因此 python 必须找到丢失的部分才能正确导入它。是的,你可能会猜到——唯一可能缺少的东西是 Boost.Python 库,所以将它的路径添加到 PATH 环境变量中——对我来说,它是 C:\local\boost_1_64_0\lib64-msvc-14.0。

那么问题就解决了。注意:其他相关问题中的一些答案可能会建议构建为静态库,这样,您将收到另一个导入错误:DLL 加载失败:%1 不是有效的 Win32 应用程序。所以只需构建为 DLL。 PS:您不需要像某些 cmets 建议的那样在 Property Pages->Linker->Input->Additional Dependencies 中指定 boost_python-vc140-mt-1_64.lib 或 boost_python-vc140-mt-gd-1_64.lib 。

【讨论】:

在python中导入时应该先使用os.add_dll_directorylink

以上是关于Boost.Python 创建的 dll 无法导入(遵循 Boost Python 的 QuickStart)的主要内容,如果未能解决你的问题,请参考以下文章

在 WinXP、VisualStudio 2005 上的 boost.python“DLL 加载失败”

尝试使用 boost/Python 相对导入超出***包

Boost.Python dll 在编译时被跳过

Boost Python,Visual Studio链接到错误的boost dll

Boost python /从线程导入模块需要ReleaseLock()。为啥?

使用boost python嵌入python时导入错误