Utilizzo VS2008 per lo sviluppo di una DLL COM che per impostazione predefinita utilizza la versione CRT 9 ma sto utilizzando TSF (framework dei servizi di testo) che non è compatibile con il nuovo CRT. Penso che la soluzione sia usare quella compatibile, quindi come posso specificare la versione CRT?Come imporre al compilatore C++ l'utilizzo di una versione CRT specifica?
risposta
Mi unisco di cuore alla raccomandazione non per modificare manualmente la versione CRT a cui si fa il collegamento. Se tuttavia, per qualche ragione (che non riesco a immaginare) questa è la giusta linea di condotta per te, il modo per farlo è cambiare il manifest per il tuo progetto.
Prima verificare che il manifesto è non generati su ogni build (il VS2005: proprietà di configurazione/file di Linker/manifesto/Genera manifesto), in quanto sarebbe sovrascrivere le modifiche manuali. Assicurati anche che l'isolamento sia abilitato. Quindi, individua il file manifest, che deve trovarsi a $ (IntDir) (ad esempio, Debug). Dovresti vedere una sezione simile a -
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC80.DebugCRT' version='8.0.50727.762' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
(Per le build di debug, ovviamente). È necessario modificare la versione e gli attributi publicKeyToken dell'elemento CRT. È possibile ispezionare i file nella cartella WINDOWS \ WinSxS locale per vedere le versioni disponibili. Controlla here come estrarre publicKeyToken una volta trovata la versione desiderata. (Anche se prima provavo e guardavo direttamente i manifesti di altri progetti, collegandomi alla versione CRT desiderata).
Se ci andate, aspettatevi un po 'd'acqua. Potresti avere un po 'di fortuna se la tua applicazione è un'app per console che non si collega ad altri componenti Side-by-Side (MFC, OpenMP, ecc.). Se la tua applicazione non è banale, sarei sorpreso se non ci fossero alcune complicate dipendenze tra versioni dei componenti SxS.
(modifica) È inoltre necessario distribuire con l'applicazione il CRT specifico che si sta utilizzando. Ecco lo someone che lo ha fatto.
Il modo più semplice sarà creare la DLL con una versione VC++ che utilizza il CRT compatibile con TFS.
Non penso che sia una buona idea collegare semplicemente la DLL a una versione diversa del CRT, a meno che non si utilizzi anche la stessa versione dei file di intestazione. E il modo più semplice per farlo è quello di utilizzare la giusta versione di VC++ ...
Se avete ancora voglia di provare, è possibile:
- andare a "Configurazione Impostazioni-> Linker-> INPUT- > Ignora libreria specifica "e inserisci il crt che stai usando (libc.lib, libcmt.lib, ecc. Vedi questo code project article per i dettagli).
- Immettere il nome della versione crt che si desidera utilizzare in "Impostazioni di configurazione-> Linker-> Input-> Ulteriori dipendenze" e il relativo percorso in "Impostazioni di configurazione-> Linker-> Generale-> Directory di libreria aggiuntive".
Si può anche provare a cambiare le directory di default in "Strumenti-> Opzioni-> Progetti e soluzioni-> directory VC++-> file di libreria". Forse cambiare $ (VCInstallDir) lib nel percorso in cui risiede l'altra versione del CRT farà il trucco
Non provare a utilizzare VS9 e collegarlo a un'altra versione del CRT.
Se è necessario collegare l'app a un altro CRT, ad esempio CRT di VS8, è necessario compilare il collegamento & nella relativa versione di VS.
Qual è il motivo esatto per cui non è possibile collegarsi a CRT di propria scelta? Potresti elaborare? –
La soluzione ha funzionato per me con Visual Studio Express 2013 x64 + x64 OpenCV 2.4.9 compilato, debug (ho integrato che in LV2013 x64), ma dovrebbe funzionare per qualsiasi altro VS-versione:
1) Fare clic con il tasto destro del mouse sulla soluzione> Proprietà> Debug file sorgente ...
2) Ci sono forse due modi (a seconda della directory di installazione VS) ... C: \ Programmi (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ vc7 \ atlmfc C: \ Programmi (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ vc7 \ crt
Con questi funzionerebbe per Visual Studio 2013 Express ma dovrebbe funzionare anche per altri 2013. Se Visual Studio 10 o 11 è sufficiente digitare "Microsoft Visual Studio 11.0" o 10.0 in ciascuno. Puoi anche aggiungerli.
Queste voci si possono ottenere da OpenCV.sln in Soluzione> Proprietà> File di origine di debug (come descritto sopra). E come già dichiarato: CRT deve corrispondere ... e questo accade in quel posto.
Vedere la risposta precedente: http://stackoverflow.com/questions/693250/vs-2008-link-against-older-c-runtime –