我正在尝试编译一个简单的 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 开发环境,所以可能我错过了什么!
谢谢!
最佳答案
使用合适的 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 .
希望这对您有所帮助!
关于python - 我的 Py_NoneStruct 符号(python、boost.python)在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29283992/