我开始在C++中编写一些我想在Python代码中调用的模块。为此,我使用boostpython。随着代码的增长,我决定将其分成几个.cpp文件。现在,我有了这样的东西:
食品.cpp#include "Bar.hpp"
#include "Baz.hpp"
#include
using namespace boost::python;
BOOST_PYTHON_MODULE(foo){
def("help", help);
class_("Bar", init<:list>())
.def("add", &Bar::add)
.def("show", &Bar::show);
}
酒吧cpp
^{pr2}$
巴水电站#ifndef Bar_hpp
#define Bar_hpp
#include
#include
#include
namespace bp=boost::python;
class Bar{
private:
std::vector<:string> items;
public:
Bar(bp::list list);
~Bar();
void add(std::string x);
bp::list show();
};
#endif
巴兹.cpp#include
#include
#include
namespace bp=boost::python;
//C++ vector to Python list
template
bp::list toPythonList(std::vector vector) {
typename std::vector::iterator iter;
bp::list list;
for (iter = vector.begin(); iter != vector.end(); ++iter) {
list.append(*iter);
}
return list;
}
//Python list to C++ int vector
std::vector toCppVectorInt(bp::list list){
std::vector vector;
for (int i=0;i !=bp::len(list) ;i++){
vector.push_back(bp::extract((list)[i]));
}
return vector;
}
//Python list to C++ string vector
std::vector<:string> toCppVectorStr(bp::list list){
std::vector<:string> vector;
for (int i=0;i !=bp::len(list) ;i++){
vector.push_back(bp::extract<:string>((list)[i]));
}
return vector;
}
std::string help(){
return "some help information ";
}
巴兹水电站#ifndef Baz_hpp
#define Baz_hpp
#include
#include
#include
namespace bp=boost::python;
template
bp::list toPythonList(std::vector vector);
//Python list to C++ int vector
std::vector toCppVectorInt(bp::list list);
//Python list to C++ string vector
std::vector<:string> toCppVectorStr(bp::list list);
std::string help();
#endif
我的设置.py文件:from distutils.core import setup
from distutils.extension import Extension
setup(name="PackageName", ext_modules=[Extension("foo",["foo.cpp"],
libraries = ["boost_python"])
])
编译时使用:python setup.py build
我得到文件福索(编译无错误地终止)。不幸的是,它不起作用。当我试图在Python解释器中使用它时,我收到了这样的效果:Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import foo
Traceback (most recent call last):
File "", line 1, in
ImportError: ./foo.so: undefined symbol: _ZN3NNB3addESs
>>>
我应该在代码中更正什么?在