Ошибки при создании интерфейса Python для нескольких файлов C ++ в общей библиотеке - PullRequest
0 голосов
/ 29 января 2019

У меня есть два файла 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

Может кто-нибудь сказать, что я не правильно делаю?

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

1 Ответ

0 голосов
/ 01 февраля 2019

Проблемы были решены путем помещения всех методов, которые я хотел показать, в один файл pyintf.cpp.Ошибки, которые я получил после обновления, были вызваны отсутствием заголовочных файлов и исходных файлов.

Теперь вышеуказанная проблема решена путем добавления заголовочных файлов (zoo.h, animal.h) и исходных файлов (zoo.cpp, animal.cpp) в команду компиляции.g ++ -shared -o pyintf.so -fPIC pyintf.cpp animal.h animal.cpp zoo.h zoo.cpp -lboost_python -lpython2.7 -I / usr / include / python2.7

Спасибо Дану заисправления.

...