sim*_*mon 2 c++ python boost mingw boost-python
我决定让我的程序与windows环境兼容.但我在windows上的编程经验很少.有些错误需要帮助.
环境:
我只复制并测试来自".\ 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;
}
Run Code Online (Sandbox Code Playgroud)
错误信息:
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*)'
................
Run Code Online (Sandbox Code Playgroud)
它还会执行一些错误,只能通过".\ boost_1_52_0\libs\python\example\tutorial"中的"bjam toolset = gcc variant = release"命令进行编译.
你有路径,但你没有链接boost和python库:
-lboost_python -lpython27
Run Code Online (Sandbox Code Playgroud)
此外,您正在尝试创建一个可执行文件(这就是为什么您必须添加一个main()示例才能编译它).对于python模块,您希望创建一个与BOOST_PYTHON_MODULE(...)宏定义的名称匹配的共享库.这些模块的扩展应该是.pyd.
-shared -o hello_ext.pyd
Run Code Online (Sandbox Code Playgroud)
如果链接器找不到boost_python库,请检查boost库目录.根据您的安装,您应该有一个
libboost_python.a或libboost_python-mgw??-mt-1_??.a.如果你找不到那样的东西,你必须先建造它们.您应该决定是否要构建静态库或共享库.更多细节在这里.
c:\boost_1_52> b2 toolset=gcc --with-python
Run Code Online (Sandbox Code Playgroud)
如果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 ;
Run Code Online (Sandbox Code Playgroud)
例如:
using python : 2.7 : c:/Python27 : c:/Python27/include : c:/Python27/libs ;
Run Code Online (Sandbox Code Playgroud)
如果您选择构建静态boost python库,则在链接程序时可能会出现其他错误.如果是这种情况,您必须指明要与静态库链接:
-DBOOST_PYTHON_STATIC_LIB
Run Code Online (Sandbox Code Playgroud)
最后,编译器可能会抱怨::hypot没有被声明.要解决这个问题,#include <cmath>在包含boost/python标头之前.