2012-10-12 9 views
8

Uso GoogleTest per testare i miei progetti C++ e dopo aver scoperto che le librerie precompilate non erano più distribuite nel pacchetto di Ubuntu, ho trovato quanto segue sul sito web del progetto:È sicuro collegarsi a una libreria statica costruita con diversi flag di compilatore

Se si compila Google prova e il tuo codice di prova utilizzando diversi compilatore bandiere, perché vedano le diverse definizioni della stessa classe di /funzione/variabile (ad esempio, a causa dell'uso di #if in Google prova). Pertanto, per la salute mentale, si consiglia di evitare l'installazione di librerie di test Google precompilate . Invece, ogni progetto deve compilare Google Test stesso in modo tale da essere certi che gli stessi flag vengano utilizzati sia per Google Test che per i test.

Quello che ne ricavo è che è una cattiva idea compilare GoogleTest separatamente dal progetto in fase di test. Quello che non capisco è se questa è solo una cosa di GoogleTest, o se questa è una cosa generale per il collegamento di librerie.

Domanda

C'è qualche situazione in cui non è sicuro per creare un collegamento a precompilati librerie di terze parti, flag di compilazione o altro, e se no, che cosa c'è di così speciale GoogleTest?

+0

Il tuo preventivo sembra che manchi la parte importante: 'Se compili Google Test e il tuo codice di test utilizzando diversi flag del compilatore, potrebbero vedere diverse definizioni della stessa classe/funzione/variabile (ad esempio, a causa dell'uso di #if in Google Test).' –

+0

Ho aggiornato la citazione con il bit che hai indicato. –

risposta

6

Alcuni flag del compilatore, in particolare quelli che funzionano con l'allineamento, potrebbero causare un problema.

Da GCC i386 and x86-64 flags

-malign-doppia
-mno-align-doppia

controllo se GCC allinea doppie, lunghe double e long variabili lunghe su un confine di due parole o un limite di una parola. L'allineamento di doppie variabili su un confine di due parole produce codice che gira un po 'più velocemente su un Pentium a spese di più memoria.

Su x86-64, -malign-double è abilitato per impostazione predefinita.

Attenzione: se si utilizza l'interruttore -malign-double, le strutture contenenti i tipi precedenti sono allineate in modo diverso rispetto alle specifiche dell'interfaccia binaria dell'applicazione pubblicata per il 386 e non sono compatibili binario con le strutture nel codice compilato senza tale opzione.

Ad esempio, l'utilizzo di tale contrassegno su un sistema a 32 bit per i doppi e i long lunghi deve essere allineato a 64 bit. Se si compila una libreria senza il flag, quindi si tenta di utilizzare la libreria mentre si utilizza il flag, le strutture che contengono i tipi precedenti potrebbero avere allineamenti diversi e potrebbero non interagire.

Altri casi (molto più semplici) possono anche garantire lo stesso set di #define per garantire la stessa funzione/struttura/definizioni di classe utilizzate (e altre violazioni ODR simili). Ad esempio, l'uso di '--std = C++ 11' in gcc, che abilita le versioni C++ 11 delle classi della libreria standard, che in alcuni casi sono diverse rispetto alle versioni precedenti.

+1

's/will/may/g' - a seconda della fortuna, la libreria potrebbe funzionare correttamente. –