Tôi có một chức năng kiểm tra đơn giản trên C++:ctypes biểu tượng lỗi AttributeError không tìm thấy, OS X 10.7.5
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>
char fun() {
printf("%i", 12);
return 'y';
}
biên dịch:
gcc -o test.so -shared -fPIC test.cpp
và sử dụng nó trong python với 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())
nhưng sau đó tôi gặp lỗi:
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
Sự cố ở đâu?
sử dụng:
Mac Os X 10.7.5 and Python 2.7
Liệu sử dụng 'gcc' liên kết một chương trình C++ với C thích hợp ++ runtime trong hệ điều hành X? Tôi mong đợi nó yêu cầu 'g ++'. Tôi biết nó không quan trọng trong trường hợp này vì mã mẫu chỉ sử dụng các hàm thư viện chuẩn của C. – eryksun
@eryksun: 'gcc' biên dịch nó thành C++ nếu tệp nguồn có hậu tố' .cpp', nhưng bạn đúng, 'g ++' được ưu tiên. Tôi đã không đề cập đến nó trong câu trả lời của tôi bởi vì có một bình luận về nó (của bạn?). Nó giống như C++ bởi vì tên mangling là khác nhau với điều kiện 'extern" C "' (xem phần thân của bài viết). – cdarke
'gcc' biên dịch nguồn là C++, nhưng trên Linux nó không liên kết với libstdC++ .vì vậy, do đó tải thư viện không thành công nếu nó yêu cầu lib C++. – eryksun