我决定让我的程序与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;
}
错误信息:
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”命令进行编译。
答案 0 :(得分:5)
你有路径,但是你没有链接到boost和python库:
-lboost_python -lpython27
此外,您正在尝试创建可执行文件(这就是为什么您必须在示例中添加main()
才能编译它)。
对于python模块,您希望创建一个与BOOST_PYTHON_MODULE(...)
宏定义的名称匹配的共享库。
这些模块的扩展名应为.pyd
。
-shared -o hello_ext.pyd
如果链接器找不到boost_python库,请检查boost库目录。根据您的安装,您应该有一个
libboost_python.a
或libboost_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