31

Compilando il codice sorgente C++ con Visual Studio 11 Developer Preview. Collegamento statico alla libreria di runtime.Qual è la particolarità degli eseguibili compilati con Visual Studio 11, il che risulta che gli eseguibili non possono essere eseguiti su Windows XP?

L'eseguibile risultante non può essere eseguito su Windows XP. Quando provo ad eseguirlo su Windows XP viene visualizzato il messaggio di errore "[Percorso eseguibile] non è un'applicazione Win32 valida.".

According to Microsoft Visual Studio 11 non supporta Windows XP.

Come funziona che l'eseguibile risultante non può essere eseguito su Windows XP? C'è qualcosa di speciale all'interno dell'eseguibile?

+0

Quale tipo di progetto si utilizza in VS2011 per la vostra applicazione? – deepmax

+0

Uso un progetto Win32 e creo un'applicazione Win32. –

+1

È un'applicazione a 32 bit.Il risultato di dumpbin è: dump del file [percorso] Tipo di file: immagine eseguibile Sommario 3000 .data 3000 .rdata 2000 .reloc 1000 .rsrc 6000 .text –

risposta

20

Sembrano abbandonare il supporto per i sistemi più vecchi in ogni nuova versione di VS (NT4,2000, XP) Anche se non si utilizza affatto la CRT, si impone ancora la versione del sottosistema PE a numeri elevati. È possibile aggirare il problema da changing the numbers back a 5.0 in una fase di post-produzione. Cambiare semplicemente quei numeri dovrebbe consentire l'avvio dell'exe su XP a meno che il nuovo CRT non stia utilizzando le funzioni WinAPI che non esistono su XP.

L'altra alternativa, se si desidera continuare a utilizzare VS11 è quello di utilizzare multi-targeting e compilatori più anziani ...

+4

Ti mostro quali funzioni mancano (sia per CRT che per MFC) e come aggirare il fatto che queste funzioni mancano su XP in questo post del blog: http://tedwvc.wordpress.com/2012/03/11/how-to-get-visual-c-2012-vc -11-beta-statically-linked-crt-and-mfc-applications-to-run-on-windows-xp/ –

8

Visual Studio 2012 sarà in grado di indirizzare Windows XP più tardi nel 2012:

Targeting Windows XP with C++ in Visual Studio 2012

"Più tardi, Microsoft fornirà un aggiornamento a Visual Studio 2012 che consentirà alle applicazioni C++ di utilizzare Windows XP. Questo aggiornamento apporta le modifiche necessarie al compilatore, al runtime e alle librerie di Visual C++ 2012 per consentire agli sviluppatori di creare applicazioni e DLL che funziona su Windows XP e versioni successive, oltre a Windows Server 2003 e versioni successive. "

Edit: Questo è ora accaduto (uff!)

1

le librerie di runtime in bundle con VS 2010 e più alto rispettare l'eseguibile di importare due nuove funzioni da kernel32.dll che mancano su Windows XP: EncodePointer e DecodePointer. Questi sono necessari per l'ennesimo idiota tentativo di migliorare la "sicurezza" del software.

In VS 2010 è disponibile un'opzione per utilizzare le librerie di runtime di Visual Studio 2008, che risolve questo problema. Non so se c'è una tale opzione nelle versioni successive di VS.

+0

Questa è una ragione. Ma non è l'unico. –

4

La soluzione alternativa consiste nell'utilizzare un diverso Platform Toolset, che collegherà una versione diversa di CRT e produrrà i binari compatibili con i sistemi operativi precedenti.

Ulteriori informazioni qui: Target Windows XP in Visual Studio 11 Beta using the Visual Studio 2010 compiler and libraries.

Con v90 toolset tuo binario sarà in grado di funzionare anche in sistemi più vecchi, come ad esempio Windows 2000.

http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-65-69/7444.BlogPic.png