PDA

Visualizza la versione completa : Problema di decorazione simboli e linking C vs C++


*Ray*
08-01-2005, 15:55
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 (http://forum.html.it/forum/showthread.php?threadid=769349)] ). 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':


# 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 ?

Ikitt
08-01-2005, 16:54
Originariamente inviato da *Ray*
[...]
Non si capisce cosa sia questo _gxx_personality_v0. Qualcuno mi sa aiutare ?
Spiegazione forse outdated, ma il nocciolo secondo me e` evidenziato:
http://gcc.gnu.org/ml/gcc-help/2002-07/msg00186.html

Per quanto riguarda l'uso di dlopen, vedi se questo puo` aiutarti:
http://www.isotton.com/howtos/C++-dlopen-mini-HOWTO/C++-dlopen-mini-HOWTO.html

Potrebbe essere un buon caso d'uso per il pattern abstract factory, credo.

*Ray*
08-01-2005, 17:27
Ti ringrazio molto per i link, specie il secondo che ho letto al volo.

Ricerche piu' approfondite intanto mi hanno infatti portato a questo (http://mail.python.org/pipermail/python-list/2002-June/108426.html)
che ha risolto il problema. Essenzialmente compilando e linkando in due stage diversi, il secondo stage non sapeva che doveva usare le convenzioni del C++.

Ora ho compilato e funziona tutto a dovere.

Loading