Parametres de compilation VC2008 pour exe petit et fonctionnant sur tout PC

Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 - 7 avril 2008 à 05:06
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 9 avril 2008 à 10:57
Salut,

J'ai un programme con comme tout qui se compile parfaitement mais dont la taille me gene.
Quand j'etais sous Visual 2006, l'exe faisait 6.5ko.
Maintenant, avec Visual 2008, il peut varier de 6.5ko a 216ko (selon les options de compilation) mais ne fonctionne sur les autres ordinateurs que lorsqu'il est tres 'gros'...

Passer de la configuration 'multi-threaded' a 'multi-threaded dll' reduit considerablement la taille de l'exe mais l'empeche de fonctionner sur d'autres ordinateurs ("Veuillez reinstaller l'application" est affiche juste apres le lancement du programme).

Quelle configuration du compilateur me permettrait d'avoir a la fois un exe petit et fonctionnant sur tous les pc?
Merci

Voici ci-dessous le code.
Si vous avez un peu de temps, pouvez-vous le compiler et me donner les tailles des exe et la compatibilite sur des machines sans environnement de developpement?
Encore merci.

Guillaume

#pragma comment(lib, "shell32.lib")
#include <shlobj.h>
#include



// Get folder name
int SelectDir( char* szFolderName )
{
 BROWSEINFO bi;
 ITEMIDLIST *il;
 char buffer[MAX_PATH];



 bi.hwndOwner = NULL;
 bi.pidlRoot = NULL;
 bi.pszDisplayName = buffer;
 bi.lpszTitle = "Select a folder";
 bi.ulFlags = 0;
 bi.lpfn = NULL; if( (il SHBrowseForFolder(&bi)) NULL ) return 0;
 return SHGetPathFromIDList(il, szFolderName);
}



char *toSlash(char* s)
{
 char *p=s;
 while (*p) { if (*p=='\\') *p='/'; p++;}
 p--;
 if (*p=='/') *p=0;
 return s;
}
int main(void)
{
 // Select local path
 char path[MAX_PATH];
 if (SelectDir(path)==TRUE) printf(toSlash(path));
 return 0;
}

10 réponses

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
7 avril 2008 à 05:54
Si ton exe est si gros, c'est parce que le compilo "inline" les fonctions du CRT directement dans ton programme.
À l'inverse, laisser ces fonctions en dehors du programme demande donc de les trimbaler avec une DLL (msvcr90.dll sous vc++ 2008). C'est pour ça que ton programme ne peut s'exécuter correctement sur d'autres configurations.

La solution est de se passer complètement du CRT.
Le problème est que ton code suggère que tu utilises la console:

int main(void)
...
printf(...);

Malheureusement, je ne connais aucun moyen de s'abstraire du CRT en utilisant la console.

Il faut créer un projet windows (GUI) et créer soit même le point d'entré du programme pour être sûr que le compilo n'ajoute pas de truc inutile:

#pragma comment(linker, "/entry:myWinMain")
void myWinMain (void)
{
    ...

    ExitProcess(0);
}

Il faut aussi désactiver tous les contrôles inutiles des buffers, des "optimisations à fibre" et, bien entendue, désactiver toutes options de débuggages. Tout ceci est configurable via les options du compilo et du linker.

C++ (@++)<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
7 avril 2008 à 06:23
"Il faut aussi désactiver tous les contrôles inutiles des buffers, des
"optimisations à fibre" et, bien entendue, désactiver toutes options de
débuggages."

En gros ça veut dire: Compile en release mais en autant que ta configuration soit bonne.

Tu peux utiliser ceci pour générer un template d'un projet déjà bien configuré (que tu pourras modifier à ton aise bien sûr).
http://www.cppfrance.com/codes/TEMPLATES-CPLUSPLUS-VS-2008_44835.aspx

C++ (@++)<!--
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
7 avril 2008 à 10:05
Si: il = SHBrowseForFolder(..) réussit, il faut libérer la mémoire:
CoTaskMemFree(il);

ciao...
BruNews, MVP VC++
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
7 avril 2008 à 17:19
Et pour te passer de printf et compagnie suffit d'utiliser les fonctions console de kernel32 : AllocConsole, WriteConsole etc...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
7 avril 2008 à 17:24
Bof bof tant qu'à faire, aussi bien passer direct en GUI.
Serait beaucoup plus lucratif en tout cas.

C++ (@++)<!--
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
8 avril 2008 à 05:11
Salut,

Merci, j'ai cree des projets win en utilisant la methode proposee par SAKingdom, mais toujours le meme probleme.
La desactivation des CLR fonctionne, mais la selection de runtime "Multi-Thread" est obligatoire sinon le programme ne fonctionne pas sur le PC de Mr tout le monde.
runtime "Multi-Thread DLL" -> 3.00ko
runtime "Multi-Thread" -> 45.00ko

...oups, j'utilisais printf... je reteste ce soir avec WriteConsole comme le suggere juju12.

Quelles autres fonctions standards sont a proscrire pour eviter de faire gonfler l'exe?

Merci BruNews pour la correction.

Merci ;)
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
8 avril 2008 à 21:49
Tu perds ton temps avec WriteConsole et compagnie. Si tu veux rester en console, garde le CRT (ainsi que le poid de l'exe).

Les fonctions du CRT à proscrire sont toutes les fonctions qui demandes un ou des appels à l'API win32 (getc, fopen, printf, scanf, malloc, free etc. etc. etc). Certaines, même sans appel à l'API, comme memset et memcpy (si la taille du buffer est variable) ainsi que les fonctions mathématiques, demande absolument le CRT.

strcpy, strcat, strlen (les petites fonctions très simple) et compagnie sont les seules dont je peux t'assurer que le CRT au grand complet ne sera pas inliné.

Le meilleur truc, je dirais, est quand tu peux te passer d'une fonction du CRT, fais le.

C++ (@++)<!--
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
8 avril 2008 à 22:12
Faire de la console, quelle idée auusi. Je comprends pour tester une fonction mais pas un prog à distribuer, c'est révolu.

ciao...
BruNews, MVP VC++
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
9 avril 2008 à 04:42
Salut,


En fait je souhaite utiliser des fonctions type selection de fichiers/dossier via interface windows (ex en premier post), compression d'images/video... dans des scripts PHP.
Il me faut donc faire des fonctions windows qui prennent des arguments et qui renvoient des valeurs que je puisse recupere dans mon script PHP.
Je souhaite egalement que les exe aient les tailles les plus petites.


Exemple d'utilisation d'une fonction windows somme dans un script PHP:


<?php
$a=5;
$b=109;
echo "La somme de $a et $b vaut: ".exec("sum $a $b");
?>


Le script est cense renvoyer:
La somme de 5 et 109 vaut: 114


Je ne tiens donc pas specialement a garder la console.
Cependant, je ne recupere plus rien en sortie du programme lorsque j'essaie de me passer de la console.


Voila vous savez tout :D.


S'il est impossible de faire de petit exe avec vc2008, tant pis je repasserais au 2005 ou au 6.


Merki,
Guillaume
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
9 avril 2008 à 10:57
Type de projet 'Cdlg' avec le lien sur mes templates que SAK t'a donné plus haut.
Exe sortira en 2.5 Ko.

ciao...
BruNews, MVP VC++
0