Staticamente che collega contro la biblioteca costruita con diversa versione di C Runtime Library, ok o cattivo?

StackOverflow https://stackoverflow.com/questions/1872759

Domanda

Si consideri questo scenario: Un link di richiesta a terze parti biblioteca A.

Una è costruito utilizzando MSVC 2008 ed è il collegamento staticamente (cioè. Costruito con / MT) per la v9.0 C Runtime Library.

L'applicazione è costruito utilizzando MSVC 2005 ed è il collegamento staticamente ad A e (utilizzando / MT) per la v8.0 C Runtime Library.

Posso vedere problemi con questo - per esempio se i tipi sono cambiati negli header tra le versioni della libreria runtime.

È cura per mantenere le intestazioni libreria di runtime compatibili tra le versioni, o si dovrebbe sempre assicurarsi che tutte le librerie collegate staticamente stanno collegando alla stessa versione della libreria di runtime?

È stato utile?

Soluzione

dovrebbe non essere un problema. Ogni link di libreria al proprio tempo di esecuzione e per lo più funzioni in modo indipendente da altre biblioteche nel processo. Il problema si verifica quando le librerie ABI non sono ben definiti. Se qualsiasi tipo di mucchio oggetto allocato viene allocato in una libreria, passato attraverso un confine biblioteca e 'liberati' in un'altra libreria ci stanno per essere problemi come un diverso gestore heap viene utilizzato per liberare un isolato dal gestore di heap utilizzato per allocare esso.

Qualsiasi tipo di c-runtime definito struct, oggetto o entità non deve essere passato dall'altra parte boundries dove potrebbe essere utilizzata una versione runtime diversi: - s 'ottenuto da una libreria ad esempio FILE * non avrà alcun significato a una libreria diversa legato contro un runtime diverso.

Per quanto a lungo come l'uso della API biblioteca tipi solo prime, e non cercare di free () passata in puntatori, o passare fuori puntatori internamente malloc () 'd memoria che si aspettano l'applicazione (o un'altra libreria) alla libera () si dovrebbe essere ok.

E 'facile cadere per il FUD che "qualcosa può andare storto" se c-runtime sono mescolati, ma si deve ricordare che, librerie e librerie dinamiche (.so / dll / .dylib) sono tradizionalmente stati sviluppati in una grande varietà di lingue:. codice permettendo scritto in asm, C, C ++, Fortran, Pascal ecc per comminicate tramite un'interfaccia binaria efficiente efficace CPU

Perché improvvisamente panico quando C è legata a C?

Altri suggerimenti

Questa è una pessima piano. Evitare. O ricompilare la libreria nel 2005 o compilare l'applicazione nel 2008.

Non è una buona idea a tutti. Lei ha alcun controllo sulle ipotesi formulate dalle librerie di runtime e le modalità di attuazione di alcuni tipi. Questo è più probabile intenzione di creare un pasticcio diabolica che no.

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