Ho un probe di configurazione che determina quali flag passare a g ++ in base alla piattaforma e alla versione. In genere utilizzo una versione successiva di gcc rispetto alla versione di installazione nativa per accedere alle funzionalità di C++ 14. Su piattaforme precedenti questo significa che devo aggiungere -D_GLIBCXX_USE_CXX11_ABI = 0 per usare il vecchio C++ ABI o non posso collegarmi con le versioni host delle librerie C++. Tuttavia alcune piattaforme più recenti utilizzano il nuovo ABI, nel qual caso è richiesto -D_GLIBCXX_USE_CXX11_ABI = 1 (o nulla).Come sondare l'ABI C++ utilizzato dalla versione di sistema di gcc sulla piattaforma di destinazione
Posso farlo in base alla versione della piattaforma di destinazione (ovvero l'output di lsb_release -a) ma mi piacerebbe un metodo più generale.
Penso di essere a metà strada con la compilazione di un programma ciao C++ con il compilatore nativo (al contrario di quello successivo) ma non riesco a capire come analizzare la versione ABI. E.g.
>strings hello | grep ABI .note.ABI-tag >strings hello | grep CXX GLIBCXX_3.4
o in modo simile sulla versione di libstdC++ utilizzata dal programma hello probe.
ldd ./hello | grep stdc++ | sed -e 's_.* /_/_' | cut -f 1 -d' ' |xargs strings | grep
Qualcuno ha suggerimenti migliori?
aggiornamento: In effetti non ho bisogno di farlo affatto. Il mio vero problema era che avevo una versione precedente di libstdC++. La compilazione ha rilevato una versione 6.0.20 e il runtime ne ha trovato uno incompatibile 6.0.19 (o possibilmente il visto). Avevo un simbolo non risolto che ho erroneamente attribuito alla versione ABI. Contrariamente alla credenza popolare, le versioni minori di libstdC++ non sono sempre compatibili con i binari. La mia intenzione è sempre quella di usare la stessa identica versione al momento dell'esecuzione e della compilazione (se non si utilizza quella nativa dell'host).
Non ho risposto alla domanda ma avendo risolto il mio problema la risposta non è più importante per me. Questa domanda può essere chiusa. –
libstdC++ è compatibile con le versioni precedenti, non sono nemmeno sicuro che seguano alcuna forma di versioning semantico. Scommetto che se ci si collegasse con 6.0.19 e si eseguisse il codice risultante con 6.0.20, funzionerebbe perfettamente. – rubenvb
Anche se è destinato a essere vero. Puoi ancora avere problemi. Ho rotto alcuni programmi (interni) usando una versione successiva della libreria che era bug incompatibile in qualche modo sottile. Non vorrei rischiare di rompere un programma di sistema in questo modo in quanto sarebbe molto difficile eseguire il debug. Vedi anche http://stackoverflow.com/questions/25979778/forcing-or-preventing-use-of-a-particular-minor-version-of-libstdc –