ctypes error AttributeError symbol not found, OS X 10.7.5

ctypes error AttributeError symbol not found, OS X 10.7.5

本文关键字:OS found error AttributeError symbol not ctypes      更新时间:2023-10-16

我在C++上有一个简单的测试函数:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>
char fun() {
    printf( "%i", 12 );
   return 'y';
}

编译:

gcc -o test.so -shared -fPIC test.cpp

并在python中使用ctypes:

from ctypes import cdll
from ctypes import c_char_p
lib = cdll.LoadLibrary('test.so')
hello = lib.fun
hello.restype = c_char_p
print('res', hello())

但后来我得到了一个错误:

Traceback (most recent call last):   File "./sort_c.py", line 10, in <module>
    hello = lib.fun   File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 366, in __getattr__
    func = self.__getitem__(name)   File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 371, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self)) 
AttributeError: dlsym(0x100979b40, fun): symbol not found

哪里有问题?

使用:

Mac Os X 10.7.5和Python 2.7

您的第一个问题是C++名称篡改。如果你在.so文件上运行nm,你会得到这样的东西:

nm test.so
0000000000000f40 T __Z3funv
                 U _printf
                 U dyld_stub_binder

如果使用C++编译时将其标记为C样式:

#ifdef __cplusplus
extern "C" char fun()
#else
char fun(void)
#endif
{
    printf( "%i", 12 );
   return 'y';
}

nm给出:

0000000000000f40 T _fun
                 U _printf
                 U dyld_stub_binder

您的第二个问题是,python将与Segmentation fault: 11(在OSX上)一起死亡。C++返回一个char,而您在python中将其标记为指向char的指针。用途:

hello.restype = c_char

相反(更改import语句以匹配)。

编辑:正如@eryksun所指出的,您不应该使用gcc,而应该使用g++。否则,将不会链接正确的C++运行时。检查OS X:

otool -L test.so

ldd,通常在UNIX/Linux上使用的工具,不与OS X一起分发)