我的 Py_NoneStruct 符号(python、boost.python)在哪里?

Posted

技术标签:

【中文标题】我的 Py_NoneStruct 符号(python、boost.python)在哪里?【英文标题】:Where is my Py_NoneStruct symbol (python, boost.python)? 【发布时间】:2015-03-26 16:34:23 【问题描述】:

我正在尝试编译一个简单的main.cpp,其中只包含boost/python.hpp

如下:

#include <boost/python.hpp>

int main() 
    return 0;

我在 git-bash shell 中使用 MSVC 命令行工具。我知道cl.exe 需要一些可以在vcvars32.bat 中找到的环境变量。

这是我如何编译/链接我的main.cpp

# Since I'm using git-bash, I can use '-' instead of '/' for options, also
# `clwrap` is a tiny script that runs vcvars32.bat and forward arguments to `cl.exe`
# `python27.lib` and the boost.python lib are automatically autolink
$ clwrap -MD -I/c/Python27/include -I$BOOST_ROOT main.cpp -link -LIBPATH:"C:\\Python27\\libs" -LIBPATH:"C:\\Users\\Charly\\works\\cpp\\boost_1_57_0\\stage\\lib"

当我这样做时,最终会出现链接错误:

main.obj : error LNK2019: unresolved external symbol __imp___Py_NoneStruct referenced in function "public: __thiscall boost::python::api::object::object(void)" (??0object@api@python@boost@@QAE@XZ)

所以,我决定检查我的python27.lib 文件,看看这里是否缺少符号:

$ nm /c/Python27/libs/python27.lib  | grep Py_None

没什么!!

但是,符号在我的libpython27.a

$ nm /c/Python27/libs/libpython27.a  | grep Py_None
00000000 I __imp__Py_NoneStruct
00000000 T _Py_NoneStruct

我确实使用.msi 安装程序(64 位)安装了python。我用好的address-model=64 构建了boost.python。这是我用于构建 boost.python 的 CLI:

.\bootstrap.bat
.\b2 --with-python --build-type=complete address-model=64 variant=release link=shared toolset=msvc

我错过了什么吗? python 安装程序有问题吗? (我找到了一个 issue 类似的东西)...

说实话,我尝试了很多东西,而且我还不太习惯 Windows 开发环境,所以也许我错过了一些东西!

谢谢!

【问题讨论】:

由于 C/C++ 运行时问题,您必须使用用于编译 Python 解释器本身的相同版本的 MS 编译器(或完全使用其他品牌的编译器)。对于 Python 2.7,我相信它是 Visual Studio 2008(或者现在特殊的 Visual C++ Compiler for Python 2.7,因为后者不再可用)。 嗯.. 最后,这更简单。我使用的是 32 位编译器而不是 64 位编译器。现在我面临另一个问题,但这与那个问题无关,也许您的评论将有助于解决这个问题!非常感谢! 【参考方案1】:

使用适当的 64 位编译器解决我的问题。

如果您查看问题,您会发现我的clwrap 正在使用vcvars32.bat。此外,它使用我系统上的cl.exe(32 位版本):

C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\bin\\cl.exe

但是我在这里找到了另一个版本的编译器:

C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\bin\\x86_amd64\\cl.exe

连同其所需的.bat 脚本:

C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\bin\\x86_amd64\\vcvarsx86_amd64.bat

我确实为我的 VS 安装了一些其他软件包。我不知道这个编译器是否带有这些包,但以防万一,这里是packages。

希望这会有所帮助!

【讨论】:

对于说英语的人,这里是packages。

以上是关于我的 Py_NoneStruct 符号(python、boost.python)在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 -- bash: /usr/bin/python: 符号链接的级别太多

Pytho怎样自学?

Python能做些什么及我的Python学习疑问

Python:替换重音符号(é 到 e)、删除 [^a-zA-Z\d\s] 和 lower() 的有效方法 [重复]

将Python的库路径添加到系统环境变量PYTHONPATH中,如python安装在C:PYTHO

4.pytho while 循环