Как скомпилировать программу на С ++ в разделяемую библиотеку для импорта в Python?

Я обычно использую Python, но теперь я хочу немного узнать о взаимодействии c ++ с Python. Для этого я написал простую программу на C ++:

#include <iostream>
using namespace std;

int SomeCalculation(float x){
int decision = 0;
if (x > 1){
decision = 1;
}
return decision;
}

int main()
{
float a = 0.5;
cout << "\n" << SomeCalculation(a) << "\n\n";
return 0;
}

Используя CodeBlocks я скомпилировал его, и он работает нормально. Теперь я хочу импортировать и использовать SomeCalculation () в Python. Насколько я понимаю (из этого) Мне нужно скомпилировать программу cpp в общую библиотеку для импорта в Python. Я нашел эту обширную тему об этом, но я полностью потерян в этом.

У меня есть файл main.cpp (код выше), который мне нужно скомпилировать в файл .so (верно?). Я попробовал следующее: g++ -fPIC -g -ggdb -c main.cpp -o main.so, Затем я пытаюсь импортировать полученный .so файл в мою программу на Python следующим образом:

import ctypes
print ctypes.CDLL('main.so').SomeCalculation(2)

Но я получаю следующую ошибку:

Traceback (most recent call last):
File "/home/kram/c++/cmod/importcpp.py", line 2, in <module>
print ctypes.CDLL('main.so').SomeCalculation(2)
File "/usr/lib/python2.7/ctypes/__init__.py", line 365, in __init__
self._handle = _dlopen(self._name, mode)
OSError: main.so: cannot open shared object file: No such file or directory

Так как я никогда (вручную) не компилировал программу на С ++, я как бы потерялся в команде сделать это. У кого-нибудь есть совет, как скомпилировать это как общую библиотеку? Все советы приветствуются!

1

Решение

Ваш .so хорошо, насколько это возможно. Тем не менее, Python не находит его:

OSError: main.so: не может открыть общий объектный файл: нет такого файла или каталога


Если вам нужно импортировать модуль C или C ++, не меняя его, вы можете использовать SWIG создать оболочку или сделать это вручную, используя механизмы Python или Boost.Python, упомянутые ниже.


Если бы вы писали расширение Python с нуля, вы обнаружите, что он ожидает некоторых хуков для инициализации вашего модуля, выяснения, какие функции он экспортирует и т. Д.

Увидеть документация для деталей — есть макросы, определенные для того, чтобы помочь вам написать хуки, необходимые Python.

На практике это может быть проще Boost.Python вместо этого, но делать это напрямую должно быть хорошо для простого примера.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector