Простой пример C ++ класса, с которым я хочу поговорить в файле с именем foo.cpp
#include <iostream>
Поскольку ctypes может общаться только с функциями C, вам нужно предоставить тех, кто объявляет их как внешние «C»
extern "C" {
Foo* Foo_new(){ return new Foo(); }
void Foo_bar(Foo* foo){ foo->bar(); }
}
class Foo{
public:
void bar(){
std::cout << "Hello" << std::endl;
}
};
скомпилируйте это в общую библиотеку
g++ -c -fPIC foo.cpp -o foo.o
g++ -shared -Wl,-soname,libfoo.so -o libfoo.so foo.o
наконец я написал оболочку Python
из ctypes import cdll
lib = cdll.LoadLibrary (‘./ libfoo.so’)
class Foo(object):
def __init__(self):
self.obj = lib.Foo_new()
def bar(self):
lib.Foo_bar(self.obj)
f = Foo()
f.bar() #prints "Hello" on the screen
«Мое главное намерение — скомпилировать код C ++ в eclipse и вызвать функцию C ++ из python в Linux». Это прекрасно работает, когда я скомпилировал код C ++ в Linux и вызвал метод C ++ из python в Linux. Но это не сработает, если я скомпилирую код C ++ в eclipse и вызову метод C ++ из python в Linux.
Error message:
symbol not found
Я новичок в цепочке инструментов eclipse, но я даю опцию компилятора и опцию связывания, как в этом
g ++ -c -fPIC foo.cpp -o foo.o
g ++ -shared -Wl, -soname, libfoo.so -o libfoo.so foo.o
Снимок параметров компилятора eclipse и параметров компоновки будет высоко оценен. Пожалуйста, помогите мне разобраться в этом вопросе. заранее спасибо
Вам нужно создать два проекта в Eclipse.
Makefile проект с существующим кодом. (Файл-> Новый-> Makefile проект с существующим кодом). В этом проекте вы должны указать свой файл foo.cpp. Затем в папке проекта вы должны создать файл с именем «Makefile». Makefile должен содержать следующие строки:
все:
g ++ -c -fPIC foo.cpp -o foo.o
g ++ -shared -W1, -soname, libfoo.so -o libfoo.so foo.o
чистить:
rm -f libfoo.so
Затем Вы должны создать правила («все» и «очистить») для этого проекта в окне «Создать цель». Если вы не видите это окно, вы должны сделать Окно-> Показать вид-> Сделать цель. Таким образом, вы можете создать файл libfoo.so, используя Eclipse, если дважды щелкнуть правило «all» в представлении «Make target».