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!

È stato utile?

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:

  1. 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.
  2. Alcune frequente bandiere usate con MSVC possono rompere ABI così (come eccezioni modello)
  3. 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:

  1. COM
  2. 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.

C ++ DLL plug-in di interfaccia

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 e delete / 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à.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top