Python ctypes не может видеть символ в общей библиотеке - PullRequest
0 голосов
/ 31 января 2019

Я вижу символ fact в общей библиотеке:

> nm -D libtest.so
                 w __cxa_finalize
000000000000111a T fact
                 w __gmon_start__
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable

, но когда я делаю

>>> import ctypes
>>> lib = ctypes.CDLL('./libtest.so')
>>> lib.fact

, я получаю

AttributeError: ./libtest.so: undefined symbol: fact

Вотсодержимое моего test.c файла:

int fact(int n);
int fact(int n) {
  if (n <= 0)
    return 1;
  return n*fact(n-1);
}

Я компилирую общую библиотеку, используя

> gcc -c -fPIC test.c -o test.o
> gcc -shared -o libtest.so test.o

Я в тупике.Что я делаю не так?

1 Ответ

0 голосов
/ 31 января 2019

Не знаю точно, в чем именно заключается ваша проблема, поскольку она прекрасно работает для меня: -)

Предлагаем вам попробовать выполнить шаги в следующей расшифровке точно , чтобы увидеть, есть ли проблема (pax$ это мое приглашение, а не часть команд, и вы увидите, что я явно использую ./ для файлов, чтобы обеспечить отсутствие возможности того, что он будет использовать файлы в другом месте вашегоразличные пути поиска):

pax$ cat ./test.c
int fact(int n) { return (n <= 0) ? 1 : n * fact(n-1); }

pax$ gcc -c -fPIC ./test.c -o ./test.o
pax$ gcc -shared -o ./libtest.so ./test.o
pax$ nm -D ./libtest.so
0000000000201028 B __bss_start
                 w __cxa_finalize
0000000000201028 D _edata
0000000000201030 B _end
0000000000000680 T fact
00000000000006ac T _fini
                 w __gmon_start__
0000000000000528 T _init
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
                 w _Jv_RegisterClasses

pax$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> import ctypes
>>> lib = ctypes.CDLL('./libtest.so') ; lib
<CDLL './libtest.so', handle 1131fe0 at 0x7fd4c53cf978>

>>> lib.fact
<_FuncPtr object at 0x7fd4c550de58>

>>> lib.fact(6)
720
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...