【问题标题】:compile some code with boost.python by mingw in win7-64bit在win7-64bit中通过mingw用boost.python编译一些代码
【发布时间】:2012-12-14 23:14:51
【问题描述】:

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

环境:

  • 操作系统:win7-64位,
  • ide:codeblocks12.11,
  • python:Python 2.7.3 Windows X86-64 安装程序(Windows AMD64 / Intel 64 / X86-64 二进制 [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”命令编译。

【问题讨论】:

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


    【解决方案1】:

    你得到了路径,但你没有链接到 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 没有被声明。为了解决这个问题,#include &lt;cmath&gt; 在包含 boost/python 标头之前。

    【讨论】:

    • 谢谢。我已经解决了这个问题。这是在64位系统编译并设置包含库的问题。
    【解决方案2】:

    为了让本教程在 Boost 1_60_0 上运行,在 Windows 7 上使用 64 位 mingw gcc(版本 4.8.1),我需要在 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 上得到未定义的错误,如Python extensions for Win64 via GCC 所示。

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

    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
    

    这也适用于 Boost 1_54_0

    【讨论】:

      猜你喜欢
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 2014-10-17
      • 1970-01-01
      相关资源
      最近更新 更多