Domanda

Quando si sviluppano e la distribuzione di applicazioni native di Windows, ho spesso bisogno di installare un runtime prima di essere in grado di eseguire il mio binario, o staticamente collegare la biblioteca con il mio binario. Per esempio, dopo la costruzione di un progetto "Win32 Console" con Visual Studio 2008, si tenta di eseguire il programma su una nuova risultati di immagini di Windows 7 in:

  

L'applicazione non è riuscito ad avviare perché la sua configurazione side-by-side non è corretta. Si prega di consultare il registro eventi applicazioni o utilizzare lo strumento Sxstrace.exe riga di comando per ulteriori dettagli.

Problemi come questo sono stati portati in altri post su StackOverflow.

Come si fa a sviluppare applicazioni che non richiedono tempi di esecuzione che non sono già sul sistema operativo di destinazione (cioè non richiedono l'installazione di pacchetti ridistribuibili o assiemi privato / condivisa side-by-side) ? Come si fa a evitare l'uso msvc [MPR] 90.dll e basta usare l'API di Windows in \ windows \ system32 *. {Dll, sys}?

Sto pensando lungo le linee di codice che esce dalla demoscene, ma questo non è spesso messo a disposizione.

È stato utile?

Soluzione

Altri hanno già risposto per quanto riguarda il collegamento CRT statico. Se si desidera anche un piccolo binario, allo stesso tempo, allora la cosa migliore è rinunciare a tubo catodico del tutto, e utilizzare solo le funzioni API Win32 per quanto possibile. Ci si può comunque certo codice CRT, in particolare relative al avvio (vale a dire quella che chiama main) e l'arresto (gestione atexit, ecc), ma per il resto il linker non si collegherà funzioni CRT che non si usa.

È possibile evitare che collega CRT del tutto utilizzando l'opzione /Zl compilatore. Ciò significa che main non funzionerà più, tuttavia - avrete bisogno di definire WinMain (nome non ha importanza, ma la firma deve corrispondere, e deve essere __stdcall), e si dovrà specificare il nome del WinMain-like funzione come punto di ingresso tramite interruttore linker /entry:. Questo vi farà risparmiare ~ 30 KB di codice CRT (testato su un cpp con main vuoto).

Se si va il secondo percorso, si potrebbe anche avere a che fare con la questione della intrinseci compilatore. Vi sono alcune funzioni che sono nominalmente definiti dal CRT (e dichiarate nelle intestazioni), ma che sono trattati in maniera particolare dal compilatore, in modo da inserire ottimizzato istruzioni di montaggio nel punto della chiamata se possibile - esempi sono memset, strlen, e una buona parte delle funzioni in <math.h>; un elenco completo può essere consultato qui . Dal momento che non si dispone di CRT, se avete bisogno di queste funzioni, o poteva evitare, ma preferisce l'intrinseca a causa del miglioramento delle prestazioni (difficile fare meglio di memset, per esempio), allora si deve dichiarare voi stessi, e usare #pragma intrinsic. Per esempio:.

// Contains macros and typedef only, so safe to include without CRT.
// We need it here for size_t.
#include <stddef.h> 

extern "C"
{
    int abs(int);
    void* memset(void*, int, size_t); 
}

#pragma intrinsic(abs, memset)

int __stdcall main(void*, void*, char*, int)
{
    char tmp[10];
    memset(tmp, abs(-123), 10);
    return 0;
}

È possibile che questo può essere compilato con:

cl /c /Zl foo.cpp
link /entry:main foo.obj

Altri suggerimenti

Collegare il CRT statico tramite l'interruttore /MT (e allo stesso modo MFC, se si sta usando).

statiche che collegano limiti ciò che si può fare con le DLL in qualche modo, ma per semplici eseguibili funziona come un fascino. (E se siete spedizione DLL, si può sempre spedire comunque assembly privati.)

Utilizzare la CRT statica. Questo non crea una dipendenza da msvc * .dll. La CRT è collegato direttamente nel vostro programma. Questo non crea dipendenze, ma fa aumentare la dimensione del vostro eseguibile.

Più informazioni su diverse opzioni CRT qui .

staticamente collegare il runtime. MS Visual C ++ ha l'opzione / MT per quella (di default è / MD)

Credo che un modo per farlo è quello di non utilizzare Visual Studio e invece utilizzare gli strumenti SDK della riga di comando. (È possibile, in alternativa a capire come config VS di fare ciò che si vuole, ma che sembra più difficile.) Per esempio:.

cl /c app.cpp
link app.obj ws2_32.lib
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top