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

Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
- - Dernière réponse : BruNews
Messages postés
21042
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;
}
Afficher la suite 

10 réponses

Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
0
Merci
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++ (@++)<!--
Commenter la réponse de SAKingdom
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
0
Merci
"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++ (@++)<!--
Commenter la réponse de SAKingdom
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
Si: il = SHBrowseForFolder(..) réussit, il faut libérer la mémoire:
CoTaskMemFree(il);

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
0
Merci
Et pour te passer de printf et compagnie suffit d'utiliser les fonctions console de kernel32 : AllocConsole, WriteConsole etc...
Commenter la réponse de cs_juju12
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
0
Merci
Bof bof tant qu'à faire, aussi bien passer direct en GUI.
Serait beaucoup plus lucratif en tout cas.

C++ (@++)<!--
Commenter la réponse de SAKingdom
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
0
Merci
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 ;)
Commenter la réponse de Galmiza
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
0
Merci
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++ (@++)<!--
Commenter la réponse de SAKingdom
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
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++
Commenter la réponse de BruNews
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
0
Merci
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
Commenter la réponse de Galmiza
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
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++
Commenter la réponse de BruNews