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

时间:2015-03-26 16:34:24

标签: python c++ windows boost-python msvc12

我正在尝试编译一个只包含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

NOTHING !!

但是,符号位于我的libpython27.a

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

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

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

我错过了什么吗?是python安装工程师吗? (我发现了issue类似的东西)......

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

谢谢!

1 个答案:

答案 0 :(得分: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

希望这有帮助!