Допустим, у меня есть два модуля в проекте Python, которые написаны на C ++ и представлены с помощью boost :: python.
#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.Как я могу это исправить?Как я могу определить несколько модулей C в проекте Python и позволить им использовать друг друга?