2012-04-04 12 views
9

Sto sviluppando un'applicazione in C++ 11, utilizzando g ++ - 4.7 e -std = C++ 0x.
La mia app è collegata a una libreria condivisa compilata con g ++ - 4.7, ma senza la direttiva -std = C++ 0x.Compatibilità di libreria tra C++ 11 e C++ 03

Sfortunatamente, non funziona nulla, nel senso che ho un comportamento strano quando utilizzo le classi e i metodi della libreria esterna. (Naturalmente compilando la mia app senza -std = C++ 0x funziona bene).

  1. Si tratta di un comportamento previsto o di un errore del compilatore?

  2. Qualsiasi soluzione (qualcosa come la parola chiave extern C)?

+1

Perché non è possibile ricompilare la libreria con '-std = C++ 0x'? – leftaroundabout

+4

È chiaramente una violazione del requisito che tutte le unità di traduzione vedano lo stesso codice se si compila una TU con una vista delle intestazioni della libreria e un'altra TU con una vista diversa. –

+1

Compilare con bandiere diverse è uno dei percorsi più brevi verso la follia. È più o meno ok per avvisi e livelli di ottimizzazione, ma quando influenza l'interpretazione del codice sorgente o il layout dei binari prodotti ... hum. –

risposta

10

La libreria standard è cambiato, e la bandiera -std=c++0x compilatore determinare quale parte della biblioteca è in uso. Provando ad utilizzare entrambe le versioni nello stesso programma, si interrompe la regola di una definizione (per ogni elemento utilizzato nella libreria standard si hanno due definizioni per lo stesso identificativo).

Non penso che ci sia qualcosa di semplice che possa essere fatto per superare questa limitazione. Dovresti assicurarti di usare solo una versione della libreria (cioè definire le macro appropriate prima di includere le intestazioni standard per disabilitare C++ 11 all'interno di quelle librerie), e anche allora non sono sicuro che il codice generato non sarebbe ancora interrompere l'ODR (se le estensioni del C++ 11 compilano il codice di libreria C++ 03 in modo diverso).

Problemi correlati