Come faccio a creare un file .exe completamente collegato staticamente con Visual Studio Express 2005?


109

Il mio ambiente C ++ preferito attualmente è l'edizione gratuita e in gran parte eccellente di Microsoft Visual Studio 2005 Express. Di tanto in tanto ho inviato file .exe di rilascio ad altre persone con risultati soddisfacenti. Tuttavia recentemente ho fatto l'inquietante scoperta che i piacevoli risultati erano basati su più fortuna che avrei voluto. Il tentativo di eseguire uno di questi programmi su un vecchio (vintage del 2001, non aggiornato scrupolosamente) XP non mi ha dato altro che un brutto messaggio "Il sistema non può eseguire x.exe" (o simile).

Alcuni googling hanno rivelato che con questo set di strumenti, anche specificando il collegamento statico si ottiene un semplice hello-world.exe che in realtà fa affidamento su file .dll extra (msvcm80.dll ecc.). Un sistema di elaborazione delle versioni incredibilmente elaborato (file manifest chiunque?) Quindi non consentirà l'esecuzione di .exe senza esattamente le versioni .dll corrette. Non voglio o ho bisogno di questa roba, voglio solo un exe autonomo vecchio stile che non fa altro che operazioni Win32 con il minimo comune denominatore e gira su qualsiasi vecchio sistema operativo win32.

Qualcuno sa se è possibile fare ciò che voglio con il mio set di strumenti esistente?

Grazie.

Risposte:


126

Per il runtime C vai alle impostazioni del progetto, scegli C / C ++ quindi "Generazione codice". Modificare l'impostazione "libreria runtime" in "multithread" anziché "dll multithread".

Se stai usando altre librerie, potresti dover dire al linker di ignorare esplicitamente il CRT collegato dinamicamente.


"Se stai usando altre librerie, potresti dover dire al linker di ignorare esplicitamente il CRT collegato dinamicamente." Recentemente mi sono imbattuto in questo problema. Stavo costruendo un'app wxWidgets, ho scoperto che avevo bisogno di ricostruire le librerie wxWidgets con la stessa modifica di generazione del codice
Bill Forster

6
Man 300 caratteri non sono molti. Nel caso in cui il commento sopra non sia chiaro, il problema è che sia i file .cpp che i file .cpp della libreria devono avere "multithread" invece di "multithreaded dll" altrimenti potrebbero verificarsi errori di collegamento.
Bill Forster,

Ciò introduce numerosi problemi relativi alla gestione dell'heap con cui probabilmente non si desidera avere nulla a che fare.
Edward Strange

Per le librerie CRT, VS fornisce le opzioni / MD e / MT. Ma che dire del collegamento statico di altre librerie in generale, ad esempio libX.lib (che potrebbe essere la mia libreria o una libreria di terze parti)?
Kiran MN,

4
Capisco error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease'. C'è un altro posto per cambiare il tipo di build? Sto costruendo l'applicazione wxWigets, proprio come @BillForster. Quindi dovrò ricostruire wxWidgets? Come lo faccio?
Tomáš Zato - Ripristina Monica

18

La mia esperienza in Visual Studio 2010 è che sono necessarie due modifiche in modo da non aver bisogno di DLL. Dalla pagina delle proprietà del progetto (fare clic con il pulsante destro del mouse sul nome del progetto nella finestra Esplora soluzioni):

  1. In Proprietà di configurazione -> Generale, modificare il campo "Utilizzo di MFC" in "Usa MFC in una libreria statica".

  2. In Proprietà di configurazione -> C / C ++ -> Generazione codice, modifica il campo "Libreria runtime" in "Multi-Threaded (/ MT)"

Non so perché entrambi fossero necessari. L'ho usato per rimuovere una dipendenza da glut32.dll.

Aggiunto in seguito: quando si apportano queste modifiche alle configurazioni, è necessario apportarle a "Tutte le configurazioni" --- è possibile selezionarlo nella parte superiore della finestra Proprietà. Se apporti la modifica solo alla configurazione di debug, non si applicherà alla configurazione di rilascio e viceversa.


1
Questo sembra funzionare in Visual Studio 2013 con una piccola aggiunta: ho dovuto cambiare Proprietà di configurazione -> Generale -> Set di caratteri in "Usa set di caratteri Unicode".
gnovice

4

Ho avuto lo stesso problema di dipendenza e so anche che puoi includere le DLL di VS 8.0 (solo versione! Non eseguire il debug! --- e anche il tuo programma deve essere rilasciato) in una cartella con il nome appropriato, nella cartella principale con il tuo .exe:

Procedura: distribuire utilizzando XCopy (MSDN)

Si noti inoltre che le cose sono garantite per andare storte se è necessario disporre di codice C ++ e C nello stesso .exe collegato staticamente perché si ottengono conflitti di linker che possono essere risolti solo ignorando il libXXX.lib corretto e quindi collegandosi dinamicamente (DLL) .

Infine, con un set di strumenti diverso (VC ++ 6.0) le cose "funzionano e basta", poiché Windows 2000 e versioni successive hanno le DLL corrette installate.


1

Per quanto riguarda la risposta di Jared, avere Windows 2000 o superiore non risolverà necessariamente il problema in questione. La risposta di Rob funziona, tuttavia è possibile che questa correzione introduca problemi di sicurezza, poiché gli aggiornamenti di Windows non saranno in grado di applicare patch alle applicazioni create come tali.

In un altro post, Nick Guerrera suggerisce di impacchettare il Visual C ++ Runtime Redistributable con le tue applicazioni, che si installa rapidamente ed è indipendente da Visual Studio.


2
Sebbene il packaging del ridistribuibile sembra essere la soluzione preferita, sono necessari i privilegi di amministratore per eseguire il programma di installazione ridistribuibile. Questa non è un'opzione praticabile se hai utenti non amministratori.
Kevin Condon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.