У меня есть два файла c ++ с именами "animal.cpp" и "zoo.cpp".Эти файлы скомпилированы как общая библиотека "zoo.so".Я хочу получить доступ к функциям, определенным в этих файлах, из интерпретатора Python.
Однако я получаю ошибки.Я пытался внести некоторые изменения, но получал разные виды ошибок.Я надеюсь, что эксперт Boost-Python поможет мне в решении этих проблем.
Примечание. Чтобы упростить задачу, я не использовал классы, иначе я мог бы легко создать классы "animal" и "zoo".
Я хочу получить доступ к обеим функциям файлов из Python,
Любое руководство будет высоко оценено.
Спасибо,
animal.cpp
+++++++++++
/*
* This is the C++ function we write and want to expose to Python.
*/
const std::string hello_animal() {
return std::string("hello, animal");
}
/*
* This is the C++ function we write and want to expose to Python.
*/
const std::string getname_animal() {
std::string input;
std::cout<<"Please enter your favorit animal name: ";
std::getline(std::cin,input);
return std::string("Your favorit animal name is: ").append(input);
}
/*
* This is a macro Boost.Python provides to signify a Python extension module.
*/
BOOST_PYTHON_MODULE(animal) {
// An established convention for using boost.python.
using namespace boost::python;
// Expose the function hello_animal().
def("hello_animal", hello_animal);
// Expose the function getname_animal().
def("getname_animal", getname_animal);
}
zoo.cpp
++++++++
/*
* This is the C++ function we write and want to expose to Python.
*/
const std::string hello_zoo() {
return std::string("hello, zoo");
}
/*
* This is the C++ function we write and want to expose to Python.
*/
const std::string getname_zoo() {
std::string input;
std::cout<<"Please enter your favorit zoo name: ";
std::getline(std::cin,input);
return std::string("Your favorit zoo name is: ").append(input);
}
/*
* This is a macro Boost.Python provides to signify a Python extension module.
*/
BOOST_PYTHON_MODULE(zoo) {
// An established convention for using boost.python.
using namespace boost::python;
// Expose the function hello_zoo().
def("hello_zoo", hello_zoo);
// Expose the function getname_zoo().
def("getname_zoo", getname_zoo);
}
Я создал общую библиотеку, используя следующую команду:
g ++ -shared -o zoo.so -fPIC zoo.cpp animal.cpp -lboost_python -lpython2.7 -I / usr / include/python2.7
Python Interpreter Команды и выходные данные:
import zoo
zoo.getname_zoo ()
Пожалуйста, введите ваше имя в зоопарке: zoo
'Ваше имя в зоопарке: zoo'
zoo.getname_animal()
Traceback (последний последний вызов): файл "", строка 1, в AttributeError: объект 'module' не имеет атрибута 'getname_animal'
Когда я делаю следующие изменения в файле animal.cpp, я получаю другую ошибку.
BOOST_PYTHON_MODULE (zoo) {
вместо
BOOST_PYTHON_MODULE (animal) {
При компиляции я получаю следующую ошибку:
[root @ localhost zooexample] # g ++ -shared -o zoo.so -fPIC zoo.cpp animal.cpp -lboost_python -lpython2.7 -I / usr / include / python2.7 /tmp/cci4WKrP.o: В функции initzoo':
animal.cpp:(.text+0x15d): multiple definition of
initzoo '/tmp/cctaGDer.o:zoo.cpp:(.text+0x15d): сначала здесь определено /tmp/cci4WKrP.o: В функции init_module_zoo()':
animal.cpp:(.text+0x179): multiple definition of
init_module_zoo ()' / tmp / cctaGDer.o: zoo.cpp :(. text + 0x179): здесь впервые определено collect2: error: ld вернул 1 статус выхода
+++++++++++++++++++++++++++++ ОБНОВЛЕНО ++++ ОБНОВЛЕНО +++++ ОБНОВЛЕНО +++++++++++++++
Учитывая предложение, данное Дэном для моего предыдущего выпуска.Теперь я создал отдельный файл pyintf.cpp, содержащий следующий код:
BOOST_PYTHON_MODULE(pyintf) {
def("hello_zoo", hello_zoo);
def("getname_zoo", getname_zoo);
def("hello_animal", hello_animal);
def("getname_animal", getname_animal);
}
, но когда я компилирую и создаю общую библиотеку, используя следующую команду:
g ++ -shared -o pyintf.so -fPIC pyintf.cpp -lboost_python -lpython2.7 -I / usr / include / python2.7
При импорте модуля "pyintf" в python появляется следующая ошибка.
import pyintf Traceback (последний вызов был последним): файл "", строка 1, в ImportError: ./pyintf.so: неопределенный символ: _Z9hello_zoov
Может кто-нибудь сказать, что я не правильно делаю?
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++