Загрузка класса C ++ в Python - PullRequest
       6

Загрузка класса C ++ в Python

0 голосов
/ 29 сентября 2018

Я пытаюсь импортировать класс C ++ в Python.Я знаю, что мог бы использовать BoostPython, SWIG или Cython, но просто для дидактических целей я пытаюсь вручную экспортировать методы и функции C ++ с extern "C".Короче говоря, я пытаюсь повторить этот .

Моя среда - Windows 10 с Anaconda 3 и Python 3.6.Я установил mingw64 4.8.3 как компилятор C / C ++.

Это мой foo.cpp:

#include <iostream>
// A simple class with a constuctor and some methods...
class Foo
{
    public:
        Foo(int);
        void bar();
        int foobar(int);
    private:
        int val;
};
Foo::Foo(int n)
{
    val = n;
}
void Foo::bar()
{
    std::cout << "Value is " << val << std::endl;
}
int Foo::foobar(int n)
{
    return val + n;
}
// Define C functions for the C++ class - as ctypes can only talk to C...
extern "C"
{
    Foo* Foo_new(int n) {return new Foo(n);}
    void Foo_bar(Foo* foo) {foo->bar();}
    int Foo_foobar(Foo* foo, int n) {return foo->foobar(n);}
}

Я скомпилировал таким образом: g++ -c -fPIC foo.cpp -o foo.o.Вывод:

foo.cpp:1:0: warning: -fPIC ignored for target (all code is position independent) [enabled by default]
#include <iostream>
^

Затем я скомпилировал следующим образом: g++ -shared -Wl,-soname,libfoo.dll -o libfoo.dll foo.o не получая ошибок / предупреждений.Файл libfoo.dll появился в папке.

Когда я пытаюсь в Python:

import ctypes
lib = ctypes.windll.LoadLibrary('libfoo.dll')

я получаю ошибку OSError: [WinError 126] the specified module could not be found.Мой рабочий каталог Python - это папка libfoo.dll.

Я попытался создать простую библиотеку C-HelloWorld: я скомпилировал таким же образом (часть gcc вместо g++), и мне это удалосьзагрузка его в Python.

В чем проблема?Это в инструкции по компиляции?Или в коде?

1 Ответ

0 голосов
/ 03 октября 2018

Я нашел решение, начинающееся с комментария @Scheff.

В Linux (я пробовал на Ubuntu 16, GCC 4.4.0 и Python 3.6) мой код вопроса работает хорошо без изменений (обав коде и в инструкциях по компиляции).

В Windows я изменил блок extern "C" следующим образом:

extern "C"
{
     __declspec(dllexport) Foo* Foo_new(int n) {return new Foo(n);}
     __declspec(dllexport) void Foo_bar(Foo* foo) {foo->bar();}
     __declspec(dllexport) int Foo_foobar(Foo* foo, int n) {return foo->foobar(n);}
}

и перекомпилировал, как и раньше.

После этого я смог импортировать модуль и класс C ++, как описано в ссылке .

Для реализации функции печати C ++ см. этот вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...