【发布时间】: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 位编译器。现在我面临另一个问题,但这与那个问题无关,也许您的评论将有助于解决这个问题!非常感谢!
标签: python c++ windows boost-python msvc12