2010-08-12 16 views
6

Ho un grande corpo di codice, compilato con/MT (cioè mi aspetto di collegarlo staticamente al CRT). Ho bisogno di combinare questo con una libreria statica di terze parti, che è stata costruita con/MD (cioè mi aspetto di collegare dinamicamente il CRT).codice di miscelazione compilato con/MT e/MD

È teoricamente possibile collegare i due in un file eseguibile senza ricompilarlo?

Se mi collego con/nodefaultlib: msvcrt, finisco con un piccolo numero di riferimenti non definiti a cose come __imp__wgetenv. Sono tentato di provare a implementare queste funzioni nel mio codice, inoltrandomi a wgetenv, ecc. Vale la pena provarlo, o mi troverò a correre direttamente nel prossimo problema?

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

risposta

3

n/MT e/MD si escludono a vicenda.

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

Source

+0

Non è la risposta che speravo, ma grazie ;-) – slowdog

0

ho trovato tale soluzione nelle fonti di OpenSSL: Tutti i file obj della libreria sono compilati con la combinazione: /MT/Zl. Come descritto dall'autore, tale combinazione consente di creare una libreria statica con capacità di compilazione con applicazioni CRT dinamico (/MD) o CRT statico (/MT).

0

Ho affrontato una situazione simile in cui avevo due librerie una con MT e un'altra con MD. Ho dovuto creare un eseguibile che utilizza funzionalità da entrambe le librerie. La libreria creata come MD era di terze parti, quindi non ho potuto ricostruirla e la libreria creata come MT ha molte dipendenze e costruirle tutte come MD è un grosso problema. Stavo ricevendo errore dal file di intestazione di configurazione di terze parti che rendeva obbligatorio creare l'eseguibile come MD. Stavo cercando il modo semplice di confezionare dll di terze parti come una dll separata come menzionato in questione. Tuttavia, non sono riuscito a trovare abbastanza spiegazioni online in questo modo semplice. Quindi i miei due centesimi sotto. Quello che segue è il modo in cui lo eludere

  1. Ho costruito un'altra .dll che fungeva da interfaccia. Questa interfaccia fondamentalmente ha avvolto tutte le chiamate API che sono state fatte a dll di terze parti. Il file di intestazione per questa interfaccia non includeva alcun file di intestazione di dll di terze parti, ma tutti quei file di intestazione erano inclusi nel file interface.cpp. L'interfaccia come previsto è stata creata come MD.
  2. Ora nel mio file main.cpp ho incluso questo file di intestazione dell'interfaccia per effettuare tutte le chiamate a dll di terze parti attraverso l'interfaccia.

  3. È necessario prestare particolare attenzione nel passare argomenti all'interfaccia. Le variabili di base come int, bool ecc possono essere passate come valore. Tuttavia qualsiasi classe o struttura deve essere passata come riferimento const per evitare il danneggiamento dell'heap. Questo è applicabile anche alla stringa.

Felice di condividere più dettagli se non è chiaro!

Problemi correlati