GCC vs MS C ++ per mantenere API compatibilità binaria
-
23-10-2019 - |
Domanda
Sono venuto dal mondo Linux e conosce un sacco di articoli di mantenere la compatibilità all'indietro binaria (BC) di un'API libreria dinamica scritta in linguaggio C ++. Uno di loro è "Politiche / binaria Problemi di compatibilità con C ++" in base al Itanium C ++ ABI , che viene utilizzato dal compilatore GCC. Ma non riesco a trovare qualcosa di simile per il Microsoft C ++ Compiler (da MSVC).
ho capito che la maggior parte delle tecniche sono applicabili al MS compilatore C ++ e vorrei scoprire compilatore-specifici le questioni relative alle differenze ABI (layout di v-table, pressare, ecc.)
Quindi, le mie domande sono le seguenti:
- Sai eventuali differenze tra MS C ++ e compilatori GCC durante la manutenzione aC?
- Dove posso trovare informazioni su MS C ++ ABI o circa il mantenimento aC di API di Windows?
Tutte le informazioni correlate sarà molto apprezzato.
Grazie mille per il vostro aiuto!
Soluzione
Prima di tutte queste politiche sono generali e si riferisce a GCC solo. Ad esempio: / marchio pubblico privato nelle funzioni è qualcosa di specifico per MSVC e non gcc
.Quindi, in pratica queste regole si applicano interamente a MSVC e compilatore in generale.
Ma ...
Si dovrebbe ricordare:
- GCC / C ++ mantiene la sua stabilità ABI dal 3,4 rilascio e si trova a circa 7 anni (dal 2004), mentre MSVC rompe l'ABI ogni major release: MSVC8 (2005), MSVC9 (2008), MSVC10 (2010) non sono compatibili con l'altro.
- Alcune frequente bandiere usate con MSVC possono rompere ABI così (come eccezioni modello)
- MSVC s'è volte incompatibili per le modalità di debug e di uscita.
Quindi sì è possibile utilizzare queste regole, ma come al solito in caso di MSVC ha molto più stranezze.
Si veda anche " Alcune riflessioni su binario compatibilità " e Qt che mantiene ABI stabile, con MSVC pure.
Nota Ho una certa esperienza con questo come seguo queste regole in CppCMS
Altri suggerimenti
In Windows, che, fondamentalmente, hanno 2 opzioni per il lungo termine la compatibilità binaria:
- COM
- mima COM
Guarda il mio post qui. Ci vedrete un modo per creare DLL e DLL di accesso in modo compatibile binario tra diversi compilatori e le versioni del compilatore.
La migliore regola per la compatibilità binaria MSVC è utilizzare un'interfaccia C. L'unica C ++ funzione è possibile farla franca, nella mia esperienza, è interfacce single-successione. Così rappresentare tutto come interfacce che utilizzano i tipi di dati C.
Ecco una lista delle cose che sono non compatibile a livello binario:
- Lo STL. Il formato binario cambia anche solo tra il debug / release, e, a seconda flag di compilazione, in modo che stai meglio è non usare STL cross-modulo.
- Heaps. Non
new
/malloc
in un modulo edelete
/free
in un altro. Ci sono diversi cumuli, che non conoscono l'un l'altro. Un altro motivo per l'STL non funziona cross-moduli. - Eccezioni. Non lasciate che le eccezioni si propagano da un modulo all'altro.
- RTTI / dynamic_casting tipi di dati provenienti da altri moduli.
- non si fidano qualsiasi altro C ++ caratteristiche.
In breve, C ++ non coerente ABI, ma non C, in modo da evitare C ++ offre moduli attraversano. Perché l'ereditarietà singola è un semplice v-table, si può utilmente utilizzarlo per esporre gli oggetti C ++, fornendo usano tipi di dati C e non fanno allocazioni di cross-heap. Questo è l'approccio utilizzato da Microsoft se stessi come pure, per esempio per l'API Direct3D. GCC può essere utile nel fornire una stabile ABI, ma lo standard non richiede questo, e MSVC sfrutta questa flessibilità.