【发布时间】: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。
标签: python c++ boost dll python-import