Экспорт функции C ++ в python с использованием ctypes: неопределенный символ

Рассмотрим этот файл, содержащий две похожие функции:

#include <iostream>

int main()
{
std::cout << "main\n";
}

int notmain()
{
std::cout << "notmain\n";
}

Я скомпилировал это в общую библиотеку:

g++ -shared -Wl,-soname,code -o code.so -fPIC code.cpp

Я хочу назвать их из Python, для main это работает нормально:

import ctypes
libc = ctypes.cdll.LoadLibrary("code.so")
libc.main()

Какие отпечатки main, Тем не мение, notmain не работает:

import ctypes
libc = ctypes.cdll.LoadLibrary("code.so")
libc.notmain()

Выход:

<ipython-input-63-d6bcf8b748de> in <module>()
----> 1 libc.notmain()

/usr/lib/python3.4/ctypes/__init__.py in __getattr__(self, name)
362         if name.startswith('__') and name.endswith('__'):
363             raise AttributeError(name)
--> 364         func = self.__getitem__(name)
365         setattr(self, name, func)
366         return func

/usr/lib/python3.4/ctypes/__init__.py in __getitem__(self, name_or_ordinal)
367
368     def __getitem__(self, name_or_ordinal):
--> 369         func = self._FuncPtr((name_or_ordinal, self))
370         if not isinstance(name_or_ordinal, int):
371             func.__name__ = name_or_ordinal

Я предполагаю, что main «экспортируется» во внешний мир (w.r.t. code.so) иначе, чем notmain так как main это особый случай в спецификации C ++. Как я могу «экспортировать» notmain таким же образом? Или: как я могу исправить исключение?

РЕДАКТИРОВАТЬ По предложению @abdallahesam я добавил estern "C" в notmain, это не изменило (или не решило) проблему:

#include <iostream>

int main()
{
std::cout << "main\n";
}

extern "C" {
int notmain()
{
std::cout << "notmain\n";
}
}

КОРРЕКЦИЯ

Предложение действительно решило проблему, мне просто нужно было перезапустить сеанс (i) python. Видимо это имеет значение 🙂

2

Решение

Я думаю, вы должны добавить внешний «С» на ваш notmain заголовок функции для предотвращения изменения имени функции компилятором c ++.

1

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

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

По вопросам рекламы [email protected]