【发布时间】:2011-12-09 18:51:52
【问题描述】:
假设我在一个 python 项目中有两个模块,它们是用 C++ 编写并使用 boost::python 公开的。
mod1.hpp
#ifndef MOD1_HPP
#define MOD1_HPP
#include <boost/python.hpp>
int square(int x);
#endif
mod1.cpp
#include "mod1.hpp"
using namespace boost::python;
int square(int x)
{
return x*x;
}
BOOST_PYTHON_MODULE (mod1)
{
def("square",&square);
}
mod2.hpp
#ifndef MOD2_HPP
#define MOD2_HPP
#include <iostream>
#include <boost/python.hpp>
#include "mod1.hpp"
int myfunc(int x);
#endif
mod2.cpp
#include "mod2.hpp"
using namespace boost::python;
int myfunc(int x)
{
int y = square(x);
std::cout << y << std::endl;
}
BOOST_PYTHON_MODULE (mod2)
{
def("myfunc",&myfunc);
}
如您所见,mod2 正在使用 mod1 中定义的函数。在没有 boost::python 包装器和 main 函数的情况下编译,它工作得非常好。
现在是编译脚本
setup.py
#!/usr/bin/python2
from setuptools import setup, Extension
mod1 = Extension('mod1',
sources = ['mod1.cpp'],
libraries = ['boost_python'])
mod2 = Extension('mod2',
sources = ['mod2.cpp'],
libraries = ['boost_python'])
setup(name='foo',
version='0.0',
description='',
ext_modules=[mod1,mod2],
install_requires=['distribute'])
它编译得很好。然后我转到build/lib.linux-i686-2.7 并启动 python2
>>> import mod1
>>> import mod2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: ./mod2.so: undefined symbol: _Z6squarei
>>>
显然 mod2 没有找到 mod1 存在问题。我该如何解决?如何在 python 项目中定义多个 C 模块并允许它们相互使用?
【问题讨论】:
标签: c++ python boost-python