begin process at 2012 02 11 04:16:52
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Autre

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

lundi 7 avril 2008 à 05:06:13 | Parametres de compilation VC2008 pour exe petit et fonctionnant sur tout PC

Galmiza

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 <iostream>

// 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;
}

lundi 7 avril 2008 à 05:54:08 | Re : Parametres de compilation VC2008 pour exe petit et fonctionnant sur tout PC

SAKingdom

Membre Club
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++ (@++)

lundi 7 avril 2008 à 06:23:22 | Re : Parametres de compilation VC2008 pour exe petit et fonctionnant sur tout PC

SAKingdom

Membre Club
"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++ (@++)

lundi 7 avril 2008 à 10:05:36 | Re : Parametres de compilation VC2008 pour exe petit et fonctionnant sur tout PC

BruNews

Administrateur CodeS-SourceS
Si: il = SHBrowseForFolder(..) réussit, il faut libérer la mémoire:
CoTaskMemFree(il);

ciao...
BruNews, MVP VC++
lundi 7 avril 2008 à 17:19:39 | Re : Parametres de compilation VC2008 pour exe petit et fonctionnant sur tout PC

juju12

Et pour te passer de printf et compagnie suffit d'utiliser les fonctions console de kernel32 : AllocConsole, WriteConsole etc...
lundi 7 avril 2008 à 17:24:52 | Re : Parametres de compilation VC2008 pour exe petit et fonctionnant sur tout PC

SAKingdom

Membre Club
Bof bof tant qu'à faire, aussi bien passer direct en GUI.
Serait beaucoup plus lucratif en tout cas.

C++ (@++)

mardi 8 avril 2008 à 05:11:15 | Re : Parametres de compilation VC2008 pour exe petit et fonctionnant sur tout PC

Galmiza

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 ;)
mardi 8 avril 2008 à 21:49:23 | Re : Parametres de compilation VC2008 pour exe petit et fonctionnant sur tout PC

SAKingdom

Membre Club
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++ (@++)

mardi 8 avril 2008 à 22:12:55 | Re : Parametres de compilation VC2008 pour exe petit et fonctionnant sur tout PC

BruNews

Administrateur CodeS-SourceS
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++
mercredi 9 avril 2008 à 04:42:02 | Re : Parametres de compilation VC2008 pour exe petit et fonctionnant sur tout PC

Galmiza

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


1 2

Cette discussion est classée dans : exe, bi, path, char, if


Répondre à ce message

Sujets en rapport avec ce message

pb de nom de volume [ par shinevilkyo ] voici un bout de mon code j utile la fonc getvolumeinfo mais j ai un pb et je ne trouve po de koi il s agit merci d aider un debutant a rogrammer sous Path de l'EXE [Qt / Linux] [ par garslouche ] Salut à tous!Je fais une appli avec Qt sous Linux et je voudaris savoir comment faire pour récupérer le path de l'EXEj'ai pensé à argv[0] mais si on a pb malloc [ par youpiyoyo ] d'apres msdn char *string; /* Allocate space for a path name */ string = malloc( _MAX_PATH );deja ca chez moi ca compil pas me compilo me di impos Un truc basique -> Liée 2 variables [ par wizard512 ] Bonjours,J'ai un petit probleme qui commence a m'aggacé :je n'arrive pas a placé 2 variables dans une variable,je m'explique   :EXEMPLE :------------- probleme avec Liste Files [ par anonyme_man_in_this_world ] salut ! !je voudrais ecrire une fonction essayant de lister les fichiers et les sous-dossiers d'un dossier mais ça ne marche pas toujours ,voila le co Trouver le path de notre fichier exe [ par aztcaLISS ] Salut,Je voudrais savoir s'il y a un fonction qui permet de connaître le path de mon fichier exe quand je lance l'application.merciazt Probleme avec HeapAlloc() [ par lektrosonic ] Bonjour,char** split_data(char* cache,int bounds<span style="color: rg FindWindow et SendMessage [ par gbourgeois0019 ] SalutJ'ai un premier programme qui a ceci comme code au tout debut du WinMain :HWND hWnd = FindWindow(0,"MonProgramme");    if ( hWnd != NULL )    {   lire un fichier ligne par ligne [ par jOlcoWboY ] Bien le bonjour, je me suis fait un 'tit bou de code afin de lire un fichier texte ligne par ligne. Je voulais juste savoir si il avait des améliorati [mfc c++] evenement entre une dll et un exe [ par wogkiller ] Bonjour,j'ai un programme qui charge dynamiquement des dll, et qui communiquent avec elles en appelant des méthodes dans le sens exe->dll, et qui norm


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,217 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales