用win7-64bit中的mingw编译一些带有boost.python的代码

时间:2012-12-30 12:24:18

标签: c++ python boost mingw boost-python

我决定让我的程序与windows环境兼容。但是我在windows上的编程经验非常少。有些错误需要帮助。

环境:

  • os:win7-64bit,
  • ide:codeblocks12.11,
  • python:Python 2.7.3 Windows X86-64安装程序(Windows AMD64 / Intel 64 / X86-64 binary [1] - 不包括源代码)
  • 编译器:来自codeblocks安装包的mingw。
  • 提升:boost1.52

我只复制并测试来自“。\ boost_1_52_0 \ libs \ python \ example \ tutorial”的“hello”代码

代码:

#include <iostream>
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>

char const* greet()
{ return "hello, world"; }

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}

using namespace std;
int main()
{
    cout << "Hello world!" << endl;
    return 0;
}

错误信息:

mingw32-g++.exe -Wall -fexceptions  -g  -ID:\boost\include\boost-1_52 -IC:\Python27\include  -c E:\project\snail-MW\test1\main.cpp -o obj\Debug\main.o
mingw32-g++.exe -LD:\boost\lib\ -LC:\Python27\libs  -o bin\Debug\test1.exe obj\Debug\main.o  
obj\Debug\main.o: In function `inithello_ext':
E:/project/snail-MW/test1/main.cpp:11: undefined reference to `boost::python::detail::init_module(char const*, void (*)())'
obj\Debug\main.o: In function `ZNK5boost6python9type_info4nameEv':
D:/boost/include/boost-1_52/boost/python/type_id.hpp:165: undefined reference to `boost::python::detail::gcc_demangle(char const*)'
obj\Debug\main.o: In function `ZNK5boost6python15to_python_valueIRKPKcEclES5_':
D:/boost/include/boost-1_52/boost/python/converter/builtin_converters.hpp:161: undefined reference to `boost::python::converter::do_return_to_python(char const*)'
................

它还会执行一些错误,只能通过“。\ boost_1_52_0 \ libs \ python \ example \ tutorial”中的“bjam toolset = gcc variant = release”命令进行编译。

2 个答案:

答案 0 :(得分:5)

你有路径,但是你没有链接到boost和python库:

-lboost_python -lpython27

此外,您正在尝试创建可执行文件(这就是为什么您必须在示例中添加main()才能编译它)。 对于python模块,您希望创建一个与BOOST_PYTHON_MODULE(...)宏定义的名称匹配的共享库。 这些模块的扩展名应为.pyd

-shared -o hello_ext.pyd

如果链接器找不到boost_python库,请检查boost库目录。根据您的安装,您应该有一个 libboost_python.alibboost_python-mgw??-mt-1_??.a。如果你找不到那样的东西,你必须先建造它们。 您应该决定是否要构建静态库或共享库。更多详情here

c:\boost_1_52> b2 toolset=gcc --with-python

如果boost无法找到你的python安装,这将失败。要配置(通常是非标准位置)python, 编辑user-config.jam。这可能在您的%HOMEDRIVE%%HOMEPATH%boost_1_52_0\tools\build\v2中。 在该文件中找到Python configuration并设置正确的路径(如果在默认位置安装了python,则不需要此步骤)。 语法是:

using python : python_version : python_base : python_incl : python_lib ;

例如:

using python : 2.7 : c:/Python27 : c:/Python27/include : c:/Python27/libs ;

如果您选择构建静态boost python库,则在链接程序时可能会出现其他错误。如果是这种情况,则必须指明您要使用以下命令链接静态库:

-DBOOST_PYTHON_STATIC_LIB

最后,编译器可能会抱怨::hypot未被声明。要在包含boost / python标头之前修复#include <cmath>

答案 1 :(得分:0)

为了使教程在Windows 7上使用64位mingw gcc(版本4.8.1)在Boost 1_60_0上运行,我需要使用msys shell中的命令:

rm -rf bin.v2/libs/python stage/lib/libboost_python-mgw48-*
./b2.exe toolset=gcc define=MS_WIN64 --with-python link=static

制作boost python库。该命令应在Boost根目录中执行。请注意,如果没有define=MS_WIN64,我会__imp_py_InitModule4上显示g++ hello.cpp -I /c/projects/boost_1_60_0/ -I /c/prog64/Python27/include -DBOOST_PYTHON_STATIC_LIB /c/projects/boost_1_60_0/stage/lib/libboost_python-mgw48-mt-1_60.a /c/prog64/Python27/python27.dll -DMS_WIN64 -shared -o hello_ext.pyd 中未定义的错误。

之后,编译Python boost教程很简单:

RewriteCond %{REQUEST_FILENAME} !-d

这也适用于Boost 1_54_0