2009-04-08 5 views
11

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?

+0

Vedere la risposta precedente: http://stackoverflow.com/questions/693250/vs-2008-link-against-older-c-runtime –

risposta

10

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.

2

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

0

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.

+0

Qual è il motivo esatto per cui non è possibile collegarsi a CRT di propria scelta? Potresti elaborare? –

0

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.