Ho una semplice funzione di prova su C++:ctypes simbolo di errore AttributeError non trovato, 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';
}
compilazione:
gcc -o test.so -shared -fPIC test.cpp
e di utilizzarlo in pitone con 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())
ma poi ho un errore:
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
Dove è un problema?
utilizza:
Mac Os X 10.7.5 and Python 2.7
costa usare 'gcc' collegare un programma C++ per il corretto C++ runtime in OS X? Mi aspetterei che richieda 'g ++'. So che non importa in questo caso poiché il codice di esempio utilizza solo le funzioni di libreria standard di C. – eryksun
@eryksun: 'gcc' lo compila come C++ se il file sorgente ha il suffisso' .cpp', ma hai ragione, 'g ++' è preferito. Non l'ho menzionato nella mia risposta perché c'era un commento (il tuo?). È dimostrabilmente C++ perché il nome mangling è diverso con il condizionale "extern" C "' (vedi corpo del post). – cdarke
'gcc' compila il sorgente come C++, ma su Linux non si collega con libstdC++. So.6, quindi il caricamento della libreria fallisce se richiede la lib di C++. – eryksun