Domanda

Utilizziamo una libreria interna (sviluppata da altri team) creata con il compilatore VC6. Questa libreria contiene principalmente API in stile C. Abbiamo un piano per migrare al compilatore di Visual Studio 9. Devo richiedere la compilazione della libreria con il compilatore VC9?

Una domanda più generica, su quali punti (può essere la manipolazione dei nomi, l'ottimizzazione ecc.) differisce una DLL costruita con due diverse versioni del compilatore di Visual Studio?

È stato utile?

Soluzione

Il conflitto si verifica in genere nella libreria C Runtime. L'idea principale è che la memoria dovrebbe essere allocata nel modulo in cui è stata allocata. Quindi sarà sicuro usare la libreria che è stata creata con diverse versioni del compilatore. Un altro problema è l'impacchettamento delle strutture, ma non ha alcuna differenza se si utilizza solo il compilatore Visual C ++.

Mangling dei nomi differisce da versione a versione in Visual C ++, ma si applica solo a Librerie C ++. Se si utilizza l'esportazione in stile C (ad esempio, se si dispone di file DEF), non c'è nulla di cui preoccuparsi.

Questa domanda non è un duplicato completo della tua, ma potrebbe essere utile.

Altri suggerimenti

AFAIK, la modifica del nome di Visual C ++ è stata stabile da una versione all'altra.

Il problema principale è che il codice compilato con una versione deve essere collegato al CRTL per quella versione e la miscelazione del codice da più versioni nella stessa DLL o EXE non funzionerà perché entrambi i codici oggetto prevedono routine RTL diverse.

D'altra parte, se si collegano DLL separate contenenti le diverse librerie dovrebbe funzionare. Dopo tutto, questo è il punto centrale delle DLL.

In quello scenario, consiglierei di usare solo le API extern & C; e (se questo è un codice a 32 bit) specificando esplicitamente la convenzione di chiamata ( __stdcall__ o WINAPI o _cdecl ...)

Inoltre, c'è un sottile gotcha quando la tua applicazione ha più copie del CRTL: hai più mucchi! e se un oggetto viene allocato su un heap e liberato su un heap diverso, l'heap viene immediatamente corrotto e andrai in crash.

Tutto sommato, se riesci a farli ricompilare con il tuo compilatore, questa è la cosa più semplice.

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