Domanda

Ho un grande corpo di codice, compilato con / MT (vale a dire in attesa di collegamento staticamente contro il CRT). Ho bisogno di combinare questo con una libreria di terze parti statiche, che è stato costruito con / MD (vale a dire in attesa di collegare il tubo catodico in modo dinamico).

E 'teoricamente possibile collegare i due in un unico eseguibile senza ricompilare sia?

Se collego con / NODEFAULTLIB: msvcrt, io alla fine con un piccolo numero di riferimenti non definiti a cose come __imp__wgetenv. Sono tentato di provare l'attuazione di tali funzioni nel mio codice, inoltro a wgetenv, ecc è che vale la pena provare, o dovrò correre dritto verso il prossimo problema?

Purtroppo sto vietato di prendere la scelta più facile di confezionare il codice di terze parti in una DLL separata: - /

È stato utile?

Soluzione

No. / MT e / MD si escludono a vicenda.

  

Tutti i moduli passati ad un dato invocazione del linker devono essere stati compilati con la stessa opzione biblioteca compilatore runtime ( / MD , / MT , / LD ).

Fonte

Altri suggerimenti

ho trovato tale soluzione nelle fonti di OpenSSL: Tutti i obj file della libreria sono compilati con la combinazione: /MT /Zl . Come autore ha descritto, tale combinazione permette di costruire libreria statica con possibilità di compilare con le applicazioni sia CRT dinamica (/MD) o CRT statico (/MT).

I affrontato situazione simile in cui ho avuto in due librerie è stato costruito con MT e un altro con MD. Ho dovuto costruire un eseguibile che utilizza le funzionalità di entrambe le librerie. La biblioteca costruita come MD era di terze parti, quindi, non ho potuto ricostruita e la biblioteca costruita come MT ha molte dipendenze e di costruire tutti loro come MD è un grande dolore. Mi stavo errore dal terzo file di intestazione parti di configurazione che ha reso obbligatoria per costruire il file eseguibile come MD. Stavo cercando il modo più semplice di imballaggio di terze parti dll come una DLL particolare di cui in oggetto. Tuttavia, non ho potuto trovare abbastanza spiegazione online su questo modo semplice. Di qui i miei due centesimi al di sotto. Quanto segue è il mio modo di aggirarlo

  1. I costruita un'altra dll che ha agito come interfaccia. Questa interfaccia praticamente avvolto tutte le chiamate API che è stato fatto al dll di terze parti. Il file di intestazione per questa interfaccia non include alcun file di intestazione da dll terzo e non tutti i file di intestazione sono stati inclusi nel file interface.cpp. Interfaccia come ci si aspetta è stato costruito come MD.
  2. Ora Nel mio file main.cpp ho incluso questo file di intestazione interfaccia per effettuare tutte le chiamate a DLL di terze parti attraverso l'interfaccia.

  3. La cura supplementare deve essere presa in passaggio di argomenti per l'interfaccia. variabili di base come int, bool ecc possono essere passate come valore. Tuttavia qualsiasi classe o esigenze di struttura per essere passate come const riferimento alla corruzione evitare di heap. Questo è valido per stringa ancora.

felice di condividere maggiori dettagli, se non è chiaro!

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