假设我在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包装器和主函数的情况下进行编译,它完全正常。
现在编译脚本
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模块并允许它们彼此使用?
答案 0 :(得分:1)
由于mod1是Python扩展,因此干净的方法就是像使用任何其他Python模块一样使用它:
object mod1 = import("mod1");
object square = mod1.attr("square");
int y = extract<int>(square(x));