Рассмотрим этот файл, содержащий две похожие функции:
#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. Видимо это имеет значение 🙂
Я думаю, вы должны добавить внешний «С» на ваш notmain заголовок функции для предотвращения изменения имени функции компилятором c ++.
Других решений пока нет …