Sto sviluppando una libreria di accesso a un dispositivo seriale per Linux e sto avendo dei problemi.
Essenzialmente la questione e' questa:
- [LIB: C, APP: C] Se compilo come C sia la libreria sia l'applicazione, non ho problemi. Questo pero' mi costringe a rinunciare ad avere parametri con valori di default (come da discussione precedente: [link] ). L'unica "soluzione" per ora e' stato semplicemente commentare le funzioni che utilizzano parametri con default values. E' ovvio che e' solo una soluzione tampone.
- [LIB: C++, APP: C] Se compilo come c++ la libreria, la libreria completa viene compilata correttamente. Notare che tutte le funzioni da esportare sono dichiarate cosi:
extern "C" nomefunzione(par1, par2, ... parn [= NULL]);
Compilando con il C standard l'applicazione, quando provo a caricare la libreria ottengo questo errore che non capisco (neanche googlando):
Error while loading library: ../libtagreader.so: undefined symbol: __gxx_personality_v0- [LIB: CPP, APP: CPP] Se compilo anche l'applicazione che carica la libreria con il C++, ottengo questo:
testapplication.cpp:19: undefined reference to `__gxx_personality_v0'
La compilazione la faccio cosi':
codice:# Compile test application gcc -Wall -g -c testapplication.cpp # Link gcc -g -o testapplication testapplication.o -ldl
Considerate che l'applicazione e' banalissima. Fa una dlopen, qualche dlsym e chiama una funzione di libreria. Tutto qui.
Non si capisce cosa sia questo _gxx_personality_v0. Qualcuno mi sa aiutare ?