2013-02-20 7 views
17

Desidero spostare il mio progetto corrente in C++ 11. Il codice viene compilato utilizzando clang ++ -std = C++ 0x. Questa è la parte facile :-). La parte difficile riguarda le librerie esterne. Non si può fare affidamento sul collegamento dei propri oggetti C++ 11 con librerie esterne che non sono state compilate con C++ 11 (vedere http://gcc.gnu.org/wiki/Cxx11AbiCompatibility). La spinta, per esempio, ha certamente bisogno di ricostruire (Why can't clang with libc++ in c++0x mode link this boost::program_options example?). Ho una fonte per tutte le librerie esterne che uso, quindi posso (con un po 'di dolore) ricostruire teoricamente queste librerie con C++ 11. Tuttavia, ciò mi lascia ancora alcuni problemi:Gestione di librerie esterne (ad es. Boost) durante la transizione a C++ 11

Sviluppo in un ambiente misto C++ 03/C++ 11: Ho alcuni vecchi progetti che utilizzano C++ 03 che richiedono una manutenzione occasionale. Ovviamente, voglio collegarli a versioni esistenti di librerie esterne. Ma per i miei progetti attuali (e nuovi), voglio collegarmi con le versioni ricostruite del C++ 11 delle librerie. Come posso organizzare i miei ambienti di sviluppo (attualmente Ubuntu 12.04 e Mac OS X 10.7) per far fronte a questo?

Suppongo che questo problema verrà affrontato da molti sviluppatori. Non andrà via, ma non ho trovato una soluzione raccomandata e generalmente approvata.

Distribuzione: Attualmente, distribuisco su server Ubuntu 12.04 LTS nel cloud. L'esperienza porta a dipendere (ove possibile) dai pacchetti standard (ad es. Libboost) disponibili con la distribuzione linux. Se sposto il mio attuale progetto in C++ 11, la mia comprensione è che dovrò costruire le mie versioni delle librerie esterne che uso. La mia ipotesi è che a un certo punto questo cambierà e saranno versioni "standard" di pacchetti di librerie con compatibilità C++ 11. Qualcuno ha qualche idea quando ci si potrebbe aspettare che accada? E presumibilmente ciò richiederà anche una soluzione standard al problema sopra menzionato - esistenza concomitante di lib di C++ 03 e librerie C++ 11 sulla stessa piattaforma.

Spero di essermi perso qualcosa di fondamentale in modo che questi problemi percepiti scompaiano in un soffio di informazioni appropriate! Sto cercando di passare a C++ 11 troppo presto?

Aggiornamento (2013/09/11): discussione correlati per macports: https://lists.macosforge.org/pipermail/macports-users/2013-September/033383.html

+3

"Come organizzo i miei ambienti di sviluppo ... per far fronte a questo?" - regola il tuo meccanismo di costruzione per passare diversi percorsi di libreria; per Clang e GCC, '-L' è tuo amico. – Xeo

+0

@Zeo, ho familiarità con -L. Non capisco perché fare in modo che Clang abbia un percorso di libreria diverso da GCC risolva il problema. Forse potresti elaborare? Se ho bisogno di creare il mio processo per il marshalling di diverse build di librerie esterne "standard" in diverse directory (probabilmente una per C++ 11, una per C++ 03 e una per libs che funziona con entrambi), quindi I Sono in un posto che preferirei evitare, e che vorrei condividere con milioni di sviluppatori che inventano (variazioni minori) la stessa ruota. È così che sarà? –

+0

Quindi ...compili con clang ma usi la documentazione di gcc ABI? :) –

risposta

1

Si dovrebbe utilizzare il toolchain di configurazione (ad esempio autotools) per "correttamente" configurare la generazione per la distribuzione di destinazione. I test di configurazione dovrebbero verificare i binari C + + compatibili con ABI e indicare al linker di usarli per primi se rilevati. In caso contrario, facoltativamente errore o fallback a un build C++ 03.

Come per le librerie di terze parti C++ 11 installate in un albero di directory parallele separato, questo non è strettamente necessario. La versione delle librerie è in circolazione da molto tempo e consente di posizionare diverse versioni affiancate sul sistema o ovunque si desideri, sempre in base alla configurazione.

Questo potrebbe sembrare disordinato, ma configurare toolchain sono stati progettati per gestire questi problemi.

+0

questi sembrano gli strumenti giusti per il lavoro. Come si fa a "verificare i binari C + + compatibili con ABI?". Con versioni diverse (C++ 03, C++ 11) di librerie esterne nella stessa dir, è possibile verificare sia la compatibilità ABI? O è necessario, ad esempio, impostare collegamenti simbolici che corrispondono all'opzione -l linker? –

+0

Sì, sembra disordinato! Troppo complicato per me tentare al momento (ho sempre trovato autoconfy spaventoso!) A meno che non riesca a copiare ciò che qualcun altro che ha più familiarità con gli strumenti ha fatto. –

Problemi correlati