2

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

环境:

  • 操作系统:win7-64位,
  • ide:codeblocks12.11,
  • python: Python 2.7.3 Windows X86-64 安装程序(Windows AMD64 / Intel 64 / X86-64 二进制 [1] -- 不包括源代码)
  • 编译器:来自codeblocks安装包的mingw。
  • 升压:升压1.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”命令编译。

4

2 回答 2

6

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

-lboost_python -lpython27

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

-shared -o hello_ext.pyd

如果链接器找不到 boost_python 库,请检查您的 boost 库目录。根据您的安装,您应该有一个 libboost_python.alibboost_python-mgw??-mt-1_??.a。如果找不到类似的东西,则必须先构建它们。您应该决定是要构建静态库还是共享库。更多细节在这里

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 <cmath>在包含 boost/python 标头之前。

于 2012-12-30T20:30:37.563 回答
1

为了使教程在 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_InitModule4Python 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

于 2016-01-03T16:06:25.833 回答