View Full Version : [C++] Dev-C++ versione 4.9.9.2
Da quando ho installato questo compilatore (che sarebbe la beta della versione 5) mi crea dei file eseguibili troppo grandi... anche facendo un programma banale (addirittura un programma che magari non fa niente) viene circa 450 kb... attivando le massime ottimizzazioni e l'opzione di compressione dell'exe si scende sui 250 kb... sempre troppo considerando che con la versione 4 mi venivano grandi circa 75 kb... cosa può essere? come si spiega?
premettendo che non conosco il MinGW ma che a livello concettuale le cose dovrebbero stare più o meno come per i compilatori Microsoft, sui compilatori Microsoft le cose stanno così: un programma vuoto (che ha solo la WinMain, vuota) occupa 152 kb in configurazione debug e 24 kb in release; rimuovendo il runtime di Visual C++ si guadagnano circa 16 kb in entrambe le configurazioni; di conseguenza in configurazione release l'exe occupa 8 kb, che è la dimensione minima di un file PE avente unicamente gli headers (4 kb, cioè la dimensione di una pagina) e una sola sezione .text (altri 4 kb), e tutto torna.
non chiedermi come si fa a rimuovere il common runtime del MinGW perché non lo so :Prrr: :D
Alvaro Vitali
13-11-2005, 21:16
La FAQ numero 6 dal sito DEV C++ (http://www.bloodshed.net/faq.html) dice:
6. The EXE files created are huge. What can i do to reduce the size ?
If you want to reduce your exe file size from 330 Ko to 12 Ko for example, go to compiler options. Then click on the Linker page and uncheck "Generate debug information". This will remove debugging information (if you want to debug, uncheck it). You can also click on Optimization page and check "Best optimization".
:)
If you want to reduce your exe file size from 330 Ko to 12 Ko for example, go to compiler options. Then click on the Linker page and uncheck "Generate debug information". This will remove debugging information
ehm.. il problema è che questa opzione è già disattivata...
17Qwerty71
13-11-2005, 21:46
La FAQ numero 6 dal sito DEV C++ (http://www.bloodshed.net/faq.html) dice:
6. The EXE files created are huge. What can i do to reduce the size ?
If you want to reduce your exe file size from 330 Ko to 12 Ko for example, go to compiler options. Then click on the Linker page and uncheck "Generate debug information". This will remove debugging information (if you want to debug, uncheck it). You can also click on Optimization page and check "Best optimization".
:)
Ma come mai le informazioni di debug occupano così molto?
Ma poi a cosa servirebbero? :confused:
vai nelle opzioni del progetto e seleziona qualcosa come "strip executable" (metti in inglese se non riesci a trovarlo)
Dreadnought
13-11-2005, 22:08
Ma come mai le informazioni di debug occupano così molto?
Ma poi a cosa servirebbero? :confused:
A debuggare il programma no?
vai nelle opzioni del progetto e seleziona qualcosa come "strip executable" (metti in inglese se non riesci a trovarlo)
L'avevo già messo (in ITA corrisponde a "comprimi l'eseguibile") ma come già detto passa da 450 kb a 250 kb circa... che però non sono i 70 della versione 4... piu che altro è questo che non riesco a capire... perchè con la vecchia versione li creava così piccoli e con questa così grandi :confused:
jappilas
13-11-2005, 22:41
L'avevo già messo (in ITA corrisponde a "comprimi l'eseguibile") ma come già detto passa da 450 kb a 250 kb circa... che però non sono i 70 della versione 4... piu che altro è questo che non riesco a capire... perchè con la vecchia versione li creava così piccoli e con questa così grandi :confused:
purtroppo non ho più usato MinGW (quindi GCC) da un po' ... ma ho l' impressione che "comprimi eseguibile" semplicemente equivalga a make compress che appunto crea un eseguibile autoscompattante -via UPX-, ma NON c' entra col rimuovere le debug information
purtroppo non ho più usato MinGW (quindi GCC) da un po' ... ma ho l' impressione che "comprimi eseguibile" semplicemente equivalga a make compress che appunto crea un eseguibile autoscompattante -via UPX-, ma NON c' entra col rimuovere le debug information
Si infatti!!
Allora ricapitoliamo sennò non si capisce: io ho attivato la compressione dell'eseguibile, ho rimosso le info di debug, ho settato l'ottimizzazione al massimo e, dopo tutti questi passaggi, l'eseguibile è grande circa 250 kb... (contro gli oltre 450 se non attivassi niente). La domanda quindi è: "perchè con il dev-c++ 4 me li creava a 70 kb e con questo no?"
leadergl
14-11-2005, 09:36
prova a creare un progetto C invece che C++ e vedi come la dimensione diminuisce notevolmente...
prova a creare un progetto C invece che C++ e vedi come la dimensione diminuisce notevolmente...
ma così non posso compilare il codice in C++....
beh di solito usando anche solo #include <fstream> oppure #include <string> la dimensione dell'eseguibile va alle stelle...se includi qualche header per le classi del c++ prova ad usare le controparti in c...
leadergl
14-11-2005, 12:43
ma così non posso compilare il codice in C++....
beh si...però se devi usare necessariamente codice C++ allora è un altro conto ma se il tuo progetto può essere tranquillamente compilato in C credo che non ci siamo problemi..
cmq a titolo di esempio anche i sorgenti del Delphi, seppur banali, occupano un botto e questo perchè ci sono impostate di default delle opzioni che fanno compilare in un unico exe anche tutte le librerie necessarie...magari è il tuo caso...
Il problema è che tutte le parti della libreria standard C++ che usano i template devono essere inclusi nell'eseguibile...
ah ok!! quindi è normale?
se voi compilate un programma in c++ che non fa niente con le opzioni di default quanto vi viene grande? (giusto per curiosità, tra l'altro non è che sia un grave problema)
alesnoce
07-12-2005, 15:22
L'avevo già messo (in ITA corrisponde a "comprimi l'eseguibile") ma come già detto passa da 450 kb a 250 kb circa... che però non sono i 70 della versione 4... piu che altro è questo che non riesco a capire... perchè con la vecchia versione li creava così piccoli e con questa così grandi :confused:
prova a disabilitare la gestione delle eccezioni dalle opzioni di progetto, forse la dimensione tornerà ad essere 70kb
quello che volevo chiedervi è come mai un progetto che dev 4 compilava a meraviglia nel 4.9.9.2 mi dà errori tipo
16 C:\Documents and Settings\alesnoce\Documenti\DevC++\Transition.h `string' does not name a type
C:\Documents and Settings\alesnoce\Documenti\DevC++\Makefile.win [Build Error] [Transition.o] Error 1
oppure altri assurdi sulla STL nei quali mi dice che non ho impostato il tipo di un vector mentre invece il tipo c'è
ultimo mio problema, per il momento: non riesco a scaricare xerces da
strumenti->cerca aggiornamenti
ci sono riuscito durante la prima installazione, poi non me lo ha più riproposto
e pensare che è l'aggiunta automatica di xerces è l'unico motivo per cui ho abbandonato dev 4
Perchè lo standard C++ ha incluso tutta la libreria standard nel namespace std...
Quindi per poter vedere le classi della libreria standard devi usare
using namespace std;
dopo gli include...
int main(){
return 0;
}
Nessun include, con la dev 4.9.9.0 viene 16KB.
Con <iostream> incluso viene 520KB.
Nessuna ottimizzazione selezionata.
Nessun include, con la dev 4.9.9.0 viene 16KB.
Con <iostream> incluso viene 520KB.
Nessuna ottimizzazione selezionata.
E' normale... E' "colpa" della libreri standard realizzata mediante template...
DanieleC88
07-12-2005, 16:43
int main(){
return 0;
}
Nessun include, con la dev 4.9.9.0 viene 16KB.
Con <iostream> incluso viene 520KB.
Nessuna ottimizzazione selezionata.
Strano davvero, ho provato quel codice minimale con gcc 4.0.2 (da Linux) e la grandezza è di 6.9Kb. Sarà forse dovuto al diverso formato (ELF).
si... se si include <iostream> la dimensione diventa enorme... mentre con il dev 4 non accadeva... per questo non capivo ;)
compilando quel prog minimale con l'opzionie "comprimi eseguibile" viene di 6 kb!
alesnoce
08-12-2005, 13:13
Perchè lo standard C++ ha incluso tutta la libreria standard nel namespace std...
Quindi per poter vedere le classi della libreria standard devi usare
using namespace std;
dopo gli include...
Lo avevo già fatto in tutti i file .cpp, e infatti dev 4 compila tutto senza problemi.
E' in dev 5 che non compila.
Mica dovrò scrivere using namespace std anche negli header?
Credo darebbe solo problemi di inclusione multipla
mah
con dev c++ 4.9.9.0 un bel progettone bello corposo con
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string>
solo 420 Kb
Lo avevo già fatto in tutti i file .cpp, e infatti dev 4 compila tutto senza problemi.
E' in dev 5 che non compila.
Mica dovrò scrivere using namespace std anche negli header?
Credo darebbe solo problemi di inclusione multipla
Dopo qualunque include della libreria sdtandard puoi fare using namespace std; per in cludere tutto il namespace oppure se ti servono pochi simboli del namespace puoi fare (per usare cout) using std.cout;
Oppure puoi fare: std.cout << "stampa questo";
Strano davvero, ho provato quel codice minimale con gcc 4.0.2 (da Linux) e la grandezza è di 6.9Kb. Sarà forse dovuto al diverso formato (ELF). e subito a pensar male di Windows :D
senti, non so come funzioni Linux e il suo amato ELF, ma in Windows le cose stanno così: il file exe viene mappato direttamente in memoria con un file mapping, rimanendo quindi quasi identico a com'è nel file: nel caso di un programma così semplice rimane del tutto identico. dunque abbiamo:
* 4 kb per gli headers (occupano di meno ma il file deve essere allineato al page boundary)
* altri 4 per la sezione .text, cioè il codice (stesso discorso di prima: c'è molto padding in un file PE)
* altri 4 per .reloc (le rilocazioni)
* altri 4 per .rdata, la quale in un caso così semplice contiene solo le due IAT (non ho mai capito perché a volte i compilatori le mettono in .rdata e altre volte in .idata, che sarebbe la più corretta...)
4x4 totale 16 kilobyte, e secondo me è concettualmente il minimo indispensabile! forse l'ELF non richiede tutto questo padding, ma in tal caso vuol dire che è più inefficiente perché il sistema operativo non ha la possibilità di fare la mappatura diretta come fa Windows... :Prrr:
DanieleC88
09-12-2005, 10:01
e subito a pensar male di Windows :D
senti, non so come funzioni Linux e il suo amato ELF, ma in Windows le cose stanno così: il file exe viene mappato direttamente in memoria con un file mapping, rimanendo quindi quasi identico a com'è nel file: nel caso di un programma così semplice rimane del tutto identico. dunque abbiamo:
* 4 kb per gli headers (occupano di meno ma il file deve essere allineato al page boundary)
* altri 4 per la sezione .text, cioè il codice (stesso discorso di prima: c'è molto padding in un file PE)
* altri 4 per .reloc (le rilocazioni)
* altri 4 per .rdata, la quale in un caso così semplice contiene solo le due IAT (non ho mai capito perché a volte i compilatori le mettono in .rdata e altre volte in .idata, che sarebbe la più corretta...)
4x4 totale 16 kilobyte, e secondo me è concettualmente il minimo indispensabile! forse l'ELF non richiede tutto questo padding, ma in tal caso vuol dire che è più inefficiente perché il sistema operativo non ha la possibilità di fare la mappatura diretta come fa Windows... :Prrr:
Alberto calmo!!! Non stavo mica attaccando Windows!!! :D
Volevo solo dire che è strano che il file generato venga grande 520kb con iostream incluso! Questo perché col mio gcc 4.0.2 un file C vuoto come quello postato da nin mi genera un eseguibile da 6.9kb, mentre un file C++ con iostream incluso me lo genera da 8.0kb, non 520kb - c'è una bella differenza...
La cosa strana è che il compilatore in effetti è quasi lo stesso, quindi mi chiedevo soltanto come fosse possibile...
prenditi un po' di camomilla! :D ;)
alesnoce
09-12-2005, 10:59
Dopo qualunque include della libreria sdtandard puoi fare using namespace std; per in cludere tutto il namespace oppure se ti servono pochi simboli del namespace puoi fare (per usare cout) using std.cout;
Oppure puoi fare: std.cout << "stampa questo";
Grazie mille cionci, ho aggiunto using namespace std dopo ogni include e adesso gira.
Ciononostante continuo a non capire il bisogno delle ripetizioni e ancor più la differenza di comportamento del dev 4.9.9.2 rispetto al 4.0. Sembra che il nuovo sia più tradizionalista: dichiarare la main come void adesso è errore, mi ha forzato a dichiararla int come nel buon vecchio c, e poi mi ha inondato di warning... vabbè, problema risolto.
Il dev si appoggia sul compilatore MingW32 che è un porting Win32 del gcc...
Il dev 4.0 ha tipo 4-5 anni...e gli standard si sono aggiornati...
Ad esempio ora gcc supporta lo standard C99 e per il C++ anche l'ultimo standard con inclusa la template library...
prenditi un po' di camomilla! :D ;) ma guarda che io sono calmissimo (MHWUAHWUAHWUAAAAAA CHE C***O TI GUARDIIIII :muro: :D), non flammerei mai contro di te :flower:, però in effetti sento un po' la mancanza di mjordan... :Prrr:
DanieleC88
09-12-2005, 14:34
ma guarda che io sono calmissimo (MHWUAHWUAHWUAAAAAA CHE C***O TI GUARDIIIII :muro: :D), non flammerei mai contro di te :flower:,
Ma lo so! :D
però in effetti sento un po' la mancanza di mjordan... :Prrr:
Già, si sente la mancanza di Renato... speriamo torni presto. :flower:
alesnoce
12-12-2005, 11:05
Devo utilizzare la libreria xerces per il parsing xml, quindi l'ho scaricata, scompattata e aggiunta in Strumenti->Opzioni di compilazione->Cartelle->include c e include c++.
A questo punto provo ad aggiungere
#include <xercesc\dom\DOM.hpp>
e va tutto bene.
Poi vado sull'howto di DOM e vedo che per effettuare il parsing ho bisogno di altri include, ma aggiungendo solo
#include <xercesc\parsers\XercesDOMParser.hpp>
#include <xercesc\dom\DOM.hpp>
ottengo
27 C:\Dev-Cpp\xerces\include\xercesc\validators\datatype\DatatypeValidator.hpp:26, from C:\Dev-Cpp\xerces\include\xercesc\framework\XMLAttr.hpp In file included from C:/Dev-Cpp/xerces/include/xercesc/validators/datatype/DatatypeValidator.hpp:26, from C:/Dev-Cpp/xerces/include/xercesc/framework/XMLAttr.hpp
e altri consimili.
Potete indirizzarmi verso una soluzione?
Grazie
ottengo
27 C:\Dev-Cpp\xerces\include\xercesc\validators\datatype\DatatypeValidator.hpp:26, from C:\Dev-Cpp\xerces\include\xercesc\framework\XMLAttr.hpp In file included from C:/Dev-Cpp/xerces/include/xercesc/validators/datatype/DatatypeValidator.hpp:26, from C:/Dev-Cpp/xerces/include/xercesc/framework/XMLAttr.hpp
e altri consimili.
Potete indirizzarmi verso una soluzione?
Grazie sto messaggio di errore non ha senso :confused:
postalo tutto intero (solo il primo, gli altri non credo che servano).
alesnoce
12-12-2005, 12:32
Linea:
27
Unità:
C:\Dev-Cpp\xerces\include\xercesc\framework\XMLAttr.hpp:27, from C:\Dev-Cpp\xerces\include\xercesc\framework\XMLDocumentHandler.hpp
Messaggio:
from C:/Dev-Cpp/xerces/include/xercesc/framework/XMLAttr.hpp:27, from C:/Dev-Cpp/xerces/include/xercesc/framework/XMLDocumentHandler.hpp
questo è il primo errore che ho suddiviso secondo i campi di dev.
Mi era venuto in mente di cambiare tutti gli slash in backslash, ma non è una cosa fattibile
alesnoce
12-12-2005, 12:57
scusate la mia stupidaggine
ho scambiato per errore quello che era solo un warning
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.