Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

exe sans dll avec Visual Studio 2005 Express (C++)

4 réponses
Avatar
ologram
Bonjour,

Est-il possible de cr=E9er un prog. qui n'ai pas de besoin de dll avec
Visual Studio 2005 express ?

J'ai cr=E9=E9 un prog. avec dev-c++ qui n'a pas besoin de dll et qui
p=E8se 13 ko. Et surtout il est possible de le faire tourner sans devoir
installer quoi que ce soit d'autre (pas besoin d'=EAtre administrateur).

Est-ce imaginable avec VS 2005 xpres c++ ?

Merci pour vos r=E9ponses.

ologram

4 réponses

Avatar
Loïc Joly
Bonjour,

Est-il possible de créer un prog. qui n'ai pas de besoin de dll avec
Visual Studio 2005 express ?

J'ai créé un prog. avec dev-c++ qui n'a pas besoin de dll et qui
pèse 13 ko. Et surtout il est possible de le faire tourner sans devoir
installer quoi que ce soit d'autre (pas besoin d'être administrateur).

Est-ce imaginable avec VS 2005 xpres c++ ?


Oui. Ca dépend de ce que fais le programme, bien entendu. Par exemple,
le code suivant :
#include<iostream>
#include<string>

using namespace std;

int main()
{
string nom;
getline(cin,nom);
cout<<endl<<nom<<endl;
return 0;
}

Génère chez moi un exécutable de 7168 octects (en mode release), avec
des options de compilation standard, et alors qu'il utilise la
bibliothèque iostream, jugée comme relativement lourde.

Pour ce qui est des DLL, à partir du moment où on les met dans le même
répertoire que l'exe (méthode actuellement préconnisée par Microsoft),
ça ne demande pas plus de droits d'administration que d'installer
l'exécutable lui même.

--
Loïc

Avatar
ologram
Merci pour ta réponse. Pour ce qui concerne l'emplacement des dll,
effectivement si on les mets dans le même répertoire c'est ok, j'ai
oublié de préciser cela dans mon post hier.

Ce qui m'embête surtout c'est le poids de ces dll et encore plus, pour
moi en tout cas, l'incapacité de savoir quelles sont les dll
nécessaires, ce que je n'arrive à voir que par des tests sur une
machine "vierge" de l'environnement de programmation et de ces dll. Ce
qui est relativement fastidieux. Peut-être y a t'il d'autres moyens de
connaître la liste des dll indispensables dans VS lui-même ?

Comme vous l'aurez compris je suis tout à fait débutant avec VS c++.
Qu'est ce que le mode release ?
Avatar
Cyrille
Bonjour,

A mon avis tu aurais plus de réponse sur
fr.comp.os.ms-windows.programmation. Je redirige la discussion là-bas.

Pour ta question de départ qui était de savoir s'il est possible de
créer un exécutable qui n'a pas besoin de dll, il est toujours possible
de réduire la dépendance envers les dll en linkant avec une version
statique de la bibliothèque plutôt qu'avec la dll. Cependant, beaucoup
de créateurs de bibliothèques ne fournissent que la dll, donc ce n'est
pas toujours possible.
Aussi, pour la "runtime library", l'exécutable se lie par défaut à
MSVCR80.DLL, ce qui oblige à fournir cette dll, sinon le programme ne
marchera que sur les ordinateur où VC++ 2005 est installé. Pour qu'il se
lie plutôt à une version statique, il faut aller dans les propriétés du
projet, dans C/C++ - Code Generation, et changer la propriété "Runtime
Library" de "Multi-threaded DLL" en "Multi-threaded" ou "Multi-threaded
Debug DLL" en "Multi-threaded Debug". Faire ça pour tous les modes:
"debug" et "release".

Merci pour ta réponse. Pour ce qui concerne l'emplacement des dll,
effectivement si on les mets dans le même répertoire c'est ok, j'ai
oublié de préciser cela dans mon post hier.

Ce qui m'embête surtout c'est le poids de ces dll et encore plus, pour
moi en tout cas, l'incapacité de savoir quelles sont les dll
nécessaires, ce que je n'arrive à voir que par des tests sur une
machine "vierge" de l'environnement de programmation et de ces dll. Ce
qui est relativement fastidieux. Peut-être y a t'il d'autres moyens de
connaître la liste des dll indispensables dans VS lui-même ?


Quand tu lances l'exécution dans VC++ 2005, dans la fenêtre de l'EDI, tu
dois voir une sous-fenêtre avec un onglet "Output" en bas à droite.
Dedans tu dois voir des lignes du style:
'MonProgramme.exe': Loaded 'C:WINDOWSsystem32gdi32.dll', No symbols
loaded.

Toutes ces lignes représentent les dll dont l'exécutable a besoin et qui
sont donc chargées à son démarrage.

Cependant une machine "vierge" a déjà plusieurs de ces dlls, et je ne
connais pas d'autres moyens de connaître celles qui manqueront que de
tester sur la machine ou de retrouver la liste des dlls présentes ce qui
reste fastidieux.

Comme vous l'aurez compris je suis tout à fait débutant avec VS c++.
Qu'est ce que le mode release ?


Le mode "release" s'oppose au mode "debug" dans lequel entre autres
subtilités le code est compilé avec des informations de débogage,
certains tests sont activés (par exemple la fonction standard assert) et
le compilateur produit un code non optimisé. De fait, un code compilé en
mode "release" se traduit en un exécutable plus petit et plus performant
qu'en mode "debug".
On développe généralement en mode "debug", et le mode "release" n'est
utilisé que pour produire l'exécutable qu'on va fournir au client.
Enfin, c'est une bonne idée de tester régulièrement en mode "release"
pour vérifier que tout se passe bien.

Tout ce que font les modes "debug" et "release" sont paramétrables dans
les propriétés de ton projet et tu peux créer d'autres modes à ta guise.

--
When you are right you cannot be too radical;
when you are wrong, you cannot be too conservative.
Dr. Martin Luther King Jr.

Avatar
Aurelien Regat-Barrel
Pour ce qui est des DLL, à partir du moment où on les met dans le même
répertoire que l'exe (méthode actuellement préconnisée par Microsoft),
ça ne demande pas plus de droits d'administration que d'installer
l'exécutable lui même.


Malheureusement non, ça ne fonctionne plus. VC++ 8 oblige de passer par
des manifest en ce qui concerne _ses_ dll. Si ton exe tente de charger
la CRT sans manifest, cette dernière affichera une erreur. Et si ton exe
a un manifest (VC++ 8 en génère un par défaut), il faut que les dll
soient installées correctement (WindowsWinSxS...).
Le mieux AMHA est de compiler & lier en static, comme l'explique Cyrille.

--
Aurélien Regat-Barrel