Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di *Ray*
    Registrato dal
    Oct 2000
    Messaggi
    495

    Problema di decorazione simboli e linking C vs C++

    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 ?

  2. #2

    Re: Problema di decorazione simboli e linking C vs C++

    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++-dl...ini-HOWTO.html

    Potrebbe essere un buon caso d'uso per il pattern abstract factory, credo.
    "Qualsiasi esperto ha paura di combattere usando la katana vera. Anch'io. Ma non ignoro la mia paura, riesco ad accettarla, e a metterla da parte accanto a me".

  3. #3
    Utente di HTML.it L'avatar di *Ray*
    Registrato dal
    Oct 2000
    Messaggi
    495
    Ti ringrazio molto per i link, specie il secondo che ho letto al volo.

    Ricerche piu' approfondite intanto mi hanno infatti portato a questo
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.