Если вы используете readelf -Ws в своем файле so, он предоставит вам элементы внутри вашей библиотеки so:
FUN C GLOBAL DEFAULT 12 _Z9getStringB5cxx11v
Вы увидите, что ваша функция действительно существует, просто у нее искаженное имя. Таким образом, правильное имя для вызова ctype в библиотеке будет _Z9getStringB5cxx11v ().
Однако с этим все еще есть несколько ошибок. Отметьте свой метод как внешний, чтобы компилятор знал, что у него есть внешняя связь:
extern string getString()
В качестве альтернативы, если вы хотите использовать его как getString (), вы можете пометить его как extern «C», что отключит C ++ mangler
extern "C" string getString()
Но в любом случае, я думаю, вы обнаружите, что у вас есть проблемы с памятью. Я думаю, что правильным способом было бы вернуть указатель стиля c на массив символов и управлять им самостоятельно, что-то вроде этого должно работать:
strfun c. cpp:
#include <iostream>
#include <string>
using namespace std;
char hostname[] = "test.stack.com";
extern "C" char * getString()
{
return hostname;
}
strfun c .py:
#!/usr/bin/env python
from ctypes import *
test=cdll.LoadLibrary("./strfunc.so")
test.getString.restype=c_char_p
print(test.getString())
В случае строки, я думаю, вам нужно выяснить, как правильно управлять памятью и типами возврата, чтобы сообщить python, что вы фактически передающая строка. Это может быть выполнимо, но не так просто, как указано выше.