Расширение функций C ++ до Python с использованием Boost Python - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь завершить два файла C ++ для использования в Python. Я использую библиотеку Python Boost. Файлы отображаются для правильной компиляции, но импорт модулей приводит к ошибке «Ошибка импорта: неопределенный символ».

Эта проблема имеет отношение к boost, который неправильно находит мои зависимые файлы c ++, но я не знаю, как их добавить.

Python версия: 2.7.12 Буст версия: 1.58 ОС: Ubuntu 16.04

Моя структура кода выглядит следующим образом:

hellomodule.cpp

#include <iostream>
#include <cstdint>
#include "test.h"

using namespace std;

void say_hello(const char* name) {
    cout << "Hello " <<  name << "!\n";
    run_test();
}

#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
using namespace boost::python;

BOOST_PYTHON_MODULE(hello)
{
    def("say_hello", say_hello);
}

test.cpp

#include "test.h"
using namespace std;

void run_test(void){
    cout << "Sup";
}

setup.py

#!/usr/bin/env python
from distutils.core import setup
from distutils.extension import Extension

module1 = Extension("hello",
                    sources = ["hellomodule.cpp", "test.cpp"],
                    libraries = ["boost_python"],
                    extra_compile_args=['-std=c++11'])

setup(name="PackageName",
    ext_modules=[module1])

Из командной строки я запускаю "python setup.py build", который создает мой файл hello.so. Когда я пытаюсь импортировать «привет», я получаю «ImportError: ./hello.so: неопределенный символ: _Z8run_testv»

Если бы кто-то мог указать мне правильное направление, это было бы очень признательно.

1 Ответ

0 голосов
/ 31 августа 2018

Похоже, у вас могут быть устаревшие файлы. Я смог воспроизвести проблему, пропустив test.cpp из sources в setup.py. В этом случае он строится просто отлично, но, как вы заметили, не импортирует. Возможно, Python находит версию hello.so, которую вы создали ранее до добавления test.cpp in.

Я бы предложил удалить build dir и любые копии hello.so, которые могли бы лежать и пытаться снова запустить сборку с нуля.

...