PDA

Visualizza la versione completa : [C] Compilare non per framework .NET


Berello
18-05-2008, 00:21
Vorrei compilare programmi C (non C++, ma semplici C) per Windows, usando il Microsoft Visual C++ 2008 Express. Ho provato a creare un progetto console Win32, ho scritto il mio codice ed ho compilato. Dopo una serie di problemi iniziali (ad esempio: uso di Unicode pre-impostato, quando Windows non lo usa... Per i nomi dei files non andava bene), sono riuscito a far funzionare il mio codice e a compilare.
Il programma sembra funzionare perfettamente.

Lo provo su altri PC, con XP e con Vista, ma su tutti il programma non funziona.
A quanto pare cerca il framework .NET, di cui non ho bisogno nelle mie semplici applicazioni.

Come faccio a compilare in modo che il codice sia funzionante su qualsiasi macchina, senza bisogno di installare il framework?


Nota:
Ho letto che lo stesso problema è stato risolto da altri andando nelle proprietà del progetto e disattivando la voce: "Usa estensioni gestite", che nel mio Visual C++ non esiste... Ho trovato una voce che mi sembra di aver capito che faccia la stessa cosa, ma è già disattivata ("Supporto Common Language Runtime").

MacApp
18-05-2008, 01:24
Originariamente inviato da Berello
Come faccio a compilare in modo che il codice sia funzionante su qualsiasi macchina, senza bisogno di installare il framework?
Dubito che tu possa farlo. Ad esempio sul mio Mac .NET non c'è. (per fortuna) ;-)

pallinopinco
18-05-2008, 01:58
Se crei un'applicazione WIN32 non hai bisogno del .NET Framework... Sei sicuro di aver creato la tipologia corretta di progetto? Quale errore viene mostrato in fase di esecuzione? Prova a postare il sorgente e l'eseguibile in uno spazio Web, in tal modo sarà possibile verificare se hai creato un'applicazione WinForm o un programma basato sulla Windows API.

oregon
18-05-2008, 09:14
Devi creare una applicazione Win32 e compilare in modalita' Release.

Berello
18-05-2008, 12:52
Vi dico i passagg che faccio per creare il progetto:

File>Nuovo>Progetto
Dall'elenco di sinistra scelgo "Visual C++">"Win32"
A questo punto dall'elenco di destra scelgo: "Progetto console Win32"
Inserisco il nome del progetto e premo OK.

A questo punto si apre una "Creazione guidata"... Faccio avanti, dato che nella prima schermata viene detto solamente che ho scelto un progetto console.
Nella seconda schermata posso scegliere:
Applicazione Windows || Applicazione console || DLL || Libreria statica (scelgo console)
e poi Progetto vuoto (lo scelgo), intestazione precompilata è disabilitato ma rimane spuntato.
Scelgo "Fine".

Ho il progetto aperto: in "Esplora soluzione", clicco con il tasto destro su "File di origine" e scelgo: Aggiungi>Nuovo elemento..., poi "Visual C++">"Codice" e scelgo "File di C++".
Do al file lo stesso nome del progetto (CercaRighe) e lo rinomino da "Esplora soluzioni" in "CercaRighe.c" (anziché .cpp).

Scelgo dal menu: "Progetto">"Proprietà di (nome progetto)".
Nella finestra che appare, scelgo a sinistra: "Proprietà di configurazione">"C/C++">"Avanzate" e imposto "Compila come: Comnpila come codice C (/TC)"
Nella stessa finestra, in "Proprietà di configurazione">"Generale" scelgo: "Set di caratteri: Utilizza set di caratteri multibyte" (anziche Unicode, che crea problemi con l'apertura dei files, passando il percorso del file come stringa).

Scrivo il codice.


Eseguo il codice come Debug e funziona bene, allora scelgo di passare ala Release: menu "Compila">"Gestione configurazione", cambio da Debug a Release.
Torno nelle proprietà del progetto e ri-eseguo le modifiche di prima (multibyte e codice C).
Menu "Compila">"Compila soluzione (F7)".

Ora che ho compilato, vado nella cartelladi VisualStudio2008>Projects>CercaRighe>Release e trovo il file "CercaRighe.exe".
Lo copio dove mi serve e lo provo.

Su un altro Vista, sorge un problema con il messaggio:
"Impossibile avviare l'applicazione specificata. La configurazione della modalità affiancata dell'applicazione non è corretta. Consultare il registro degli eventi applicazioni per ulteriori informazioni."

Dunque il programma non viene eseguito.

Ho messo una copia del sorgente e dell'applicazione da me compilata in questo file (http://berello.altervista.org/zztmp/CercaRighe.zip) .

Ripeto che sul Vista sul quale ho compilato, il programma funziona perfettamente.

pallinopinco
18-05-2008, 13:09
Ho messo una copia del sorgente e dell'applicazione da me compilata in questo file .

Ripeto che sul Vista sul quale ho compilato, il programma funziona perfettamente.


Funzionerà perfettamente su tutti i sistemi nei quali è installato il Microsoft Visual C++ 2008 Redistributable Package (http://www.microsoft.com/downloads/details.aspx?displaylang=it&FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf). L'eseguibile contiene un riferimento alla libreria MSVCR90.DLL, se non è presente nel sistema ovviamente il programma protesta e si rifiuta di funzionare! :)

Berello
18-05-2008, 13:24
E non è possibile fare files eseguibili che funzionano su tutti i sistemi Windows, senza installare altre applicazioni? (come si faceva un tempo e come si fa ancora oggi su Linux...)

Cosa posso cambiare per rendere eseguibile senza installazione il mio programma? Mi sembra strano che non si possa fare, credo piuttosto che dipenda da una mia carenza di conoscenze . :D



Aggiungo una nota per chi volesse vedere il sorgente che ho linkato prima: il server su cui l'ho messo ha delle protezioni, per cui se non si apre il file, copiate l'indirizzo in una nuova finestra del browser e incollatelo manualmente (così dovrebbe aprirvelo).

Ho provato l'eseguibile su XP e l'errore era questo:
"This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem."
Immagino che il significato sia sempre lo stesso.

pallinopinco
18-05-2008, 14:20
come si faceva un tempo e come si fa ancora oggi su Linux


Su Linux un programma funziona SE trova le librerie dinamiche che necessita, come accade per tutti i sistemi operativi mainstream. Ovviamente se scrivi un programmino semplice non noti il problema, ma appena inizi ad avere un po' di dipendenze la situazione può peggiorare molto più di quanto accada con il DLL Hell di Windows.



Cosa posso cambiare per rendere eseguibile senza installazione il mio programma?


Devi compilare staticamente (http://msdn.microsoft.com/en-us/library/abx4dbyh(VS.80).aspx) l'eseguibile (linkando la libreria libcmt.lib e non msvcrt.lib).

Se per esempio compili da linea di comando:

cl cercarighe.c

La dimensione dell'eseguibile passa da 8k a 52k, però elimini le dipendenze da DLL esterne.



Immagino che il significato sia sempre lo stesso.

Esatto, non trova la DLL indicata nel messaggio precedente.

pallinopinco
18-05-2008, 14:39
Se vuoi farlo direttamente dall'IDE di Visual C++ devi impostare la libreria di runtime "Multithread /MT " tra le opzioni di progetto (Proprietà di config => C/C++ => Generazione Codice).

Se l'eseguibile ha dimensioni inferiori a 40/50k significa che hai sbagliato qualche passaggio...

Berello
18-05-2008, 16:57
Grazie mille, pallinopinco!!!
Hai risolto alla perfezione il mio problema! Adesso riesco ad eseguire quell'applcazione anche sui computer su cui prima non andava! :D

Sei stato chiarissimo! :D

Loading