Devo creare un collegamento a Visual Studio C runtime modo statico o dinamico?

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

  •  16-09-2019
  •  | 
  •  

Domanda

Ho letto gli argomenti su entrambi i lati sul fatto che si deve collegare alla libreria di runtime C statico o dinamico in progetti di Visual Studio, e non sono ancora del tutto sicuro di cosa pensare.

Il mio progetto tira in alcune librerie di terze parti (Python, HDF5, Trilinos, e Microsoft MPI), ognuno dei quali deve essere costruito con la stessa libreria di runtime come il mio eseguibile finale (altrimenti non possono essere collegati tra loro). Quando si collegano in modo statico, ognuna di queste librerie conterrà una copia del runtime C. Ho letto che questo è suscettibile di causare problemi, perché l'eseguibile finale conterrà più copie del runtime, nessuna delle quali può interagire con l'altro. Ma non sarebbe il linker lamentarsi se gli stessi simboli sono stati definiti moltiplicano?

Vorrei evitare di "DLL Hell", ma sono preoccupato per gli errori insidiosi che potrebbero derivare da linkare staticamente in più copie del runtime. Sto leggendo cose sbagliate?

Inoltre, sto usando Visual Studio 2005 e ho letto che il 1 runtime Service Pack non è compatibile con le versioni precedenti. Questo significa che un app costruito senza SP1 non verrà eseguito su una macchina che ha le DLL SP1, anche se hanno lo stesso nome (ad esempio msvcr80.dll)?

È stato utile?

Soluzione

Il collegamento statico sarà gonfiare tutti i vostri EXE e DLL, e può causare crash (ad es. Se il codice in una DLL chiama free () con un puntatore allocata da malloc () in una DLL diversa).

È possibile ottenere il meglio dei due mondi, collegando in modo dinamico e distribuire le DLL di runtime come assembly privati. Questo significa semplicemente mettere una copia di una directory appositamente denominata contenente le DLL di runtime e le loro manifesti accanto al tuo eseguibile.

Si veda la sezione "Distribuzione di Visual C ++ DLL biblioteca come assembly privati" all'indirizzo http://msdn.microsoft.com/en-us/library/ms235291 (VS.80) aspx per i dettagli, ma fondamentalmente l'applicazione si presenta così:

c:\Program Files\My App\MyApp.exe
c:\Program Files\My App\MyLibrary.dll
c:\Program Files\My App\Microsoft.VC80.CRT\Microsoft.VC80.CRT.manifest
c:\Program Files\My App\Microsoft.VC80.CRT\msvcr80.dll

Per quanto riguarda la tua ultima domanda, sì, il computer di destinazione ha bisogno le versioni corrette delle DLL di runtime di lavorare, ma di distribuirli come assembly privati, è garantire che.

Un altro vantaggio è che gli utenti non amministratori possono installare la tua app (non in Program Files, ma altrove.) - non hanno bisogno di permesso di scrivere i file nella zona WinSxS

Altri suggerimenti

L'unica volta che si otterrà più copie del runtime è quando si collega staticamente una biblioteca in una DLL - ogni DLL otterrà una copia, e così sarà l'exe. Se sono tutti librerie statiche e non DLL, saranno tutti insieme collegamento e tutte le librerie condivideranno lo stesso tempo di esecuzione.

Questo è il compito del linker.

... Fatelo staticamente ... tenta di risolvere inferno DLL non hanno funzionato così bene ... basta aggiungere un 200k in più per l'installazione con il collegamento statico.

Le librerie statiche Non tiratevi necessità di essere staticamente collegati ad altri librerie statiche. Hai solo bisogno di collegare tutte le librerie statiche nel progetto principale. In questo modo il compilatore non si lamenterà più simboli.

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