C/C++ - Lancement d'un exécutable

Résolu/Fermé
Isendil Messages postés 799 Date d'inscription lundi 14 janvier 2008 Statut Membre Dernière intervention 5 mai 2013 - 11 nov. 2008 à 21:22
 RICHARD - 20 août 2017 à 11:43
Bonsoir,
je suis encore débutant en C (et un peu en C++ aussi ;-) ) et j'aimerais savoir comment lancer un exécutable (comme Test.exe , n'importe ) et éventuellement l'insérer dans le programme une fois compilé... J'ai entendu parler de shellexecute() et d'autres fonctions mais je ne comprend pas vraiment comment faire.

Merci d'avance,
Isendil

4 réponses

mamiemando Messages postés 33076 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 avril 2024 7 748
12 nov. 2008 à 01:28
D'abord, quelques petits rappels afin que tout soit clair.

Les phases de compilation

En fait tu commences par écrire ton programmes (fichiers .c et .h en C et .cpp et .hpp en C++) et tu lances une compilation, par exemple avec gcc (en C) ou g++ (en C++). Par exemple, dev-cpp ou code::blocks reposent sur gcc et g++. La compilation (au sens vague du terme) se déroule en trois grandes phases :

1) Le compilateur commence par appliquer chaque instructions passées au précompilateur (toutes les lignes qui commencent par un #, dont les #define). On parle de phase de précompilation. Ces instructions sont en fait très simple car elles ne consistent en gros qu'à recopier ou supprimer des sections de codes sans chercher à les compiler. C'est notamment à ce moment là que les #define présents dans un fichier source (.c ou .cpp) ou dans un header (.h ou .hpp) sont remplacés par du code C/C++. À l'issue de cette étape, il n'y a donc plus pour le compilateur d'instruction commençant par un #.

2) Ensuite, le compilateur compile chaque fichier source (.c et .cpp), c'est-à-dire qu'il crée un fichier binaire (.o) par fichier source, excepté pour le fichier contenant la fonction main. Cette phase constitue la compilation proprement dite. Il compile enfin le fichier contenant le main

3) Enfin, il l'assemble avec chaque fichier .o et les éventuelles binaires des librairies que tu utilises (fichiers .a et .so sous linux, fichier .dll sous windows). Il vérifie en particulier que chaque fonction appelée dans le programme n'est pas seulement déclarée (ceci est fait lors de la compilation) mais aussi implémentée (chose qu'il n'avait pas vérifié à ce stade). Il vérifie aussi qu'une fonction n'est pas implémentée dans plusieurs fichiers .o. Cette phase, appelée édition de lien, constitue la phase finale pour obtenir un exécutable (noté .exe sous windows, en général pas d'extension sous linux).

Évidemment, dans un environnement de développement, il suffit de cliquer sur "build" et ces trois phases se déroulent de manière transparente. Toutefois, il est important de les avoir en tête pour interpréter correctement les messages d'erreur ou de warning de ton compilateur lorsqu'il y en a.

Je rappelle qu'un warning signifie que le code est ambigu et que le code peut être interprété différemment d'un compilateur à l'autre, mais l'exécutable peut être crée. A contrario, une erreur signifie que le code n'a pas pu être compilé complètement et que l'exécutable n'a pas pu être (re)créé. Si un code peut compiler avec des warnings et doit compiler sans erreurs, je t'invite à coder de sorte à n'avoir ni erreur, ni warning.

Comment fait-on en pratique pour écrire un programme en C

1) Je commence par écrire un fichier source, par exemple plop.c :
#include <stdio.h>

int main(){
    printf("plop !\n");
    return 0;
}

2) Ensuite on compile. Ici je suis sous linux donc j'appelle directement gcc (-W et -Wall permettent d'afficher plus de messages pour vérifier si le code est propre, le -o plop.exe permet de dire que l'exécutable à créer doit s'appeler plop.exe) :
gcc -W -Wall -o plop.exe plop.c

Implicitement le compilateur fait les trois étapes que je t'ai décrit juste avant.

a) Précompilation
/* Tout ce qui est défini par <stdio.h>, y compris printf() */

int main(){
    printf("plop !\n");
    return 0;
}

b) Compilation (il trouve bien le printf car celui-ci est déclaré dans <stdio.h>)
c) Édition de lien (il trouve bien le printf dans le binaire de la lib c). On peut d'ailleur le vérifier sous linux avec ldd :
ldd plop.exe

.. qui donne :
        linux-gate.so.1 =>  (0xb7f2b000)
        libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7dbb000)
        /lib/ld-linux.so.2 (0xb7f2c000)
Sur la deuxième ligne on voit bien qu'il utilise la lib c. Puis il crée plop.exe. On vérifie en outre qu'il n'y a ni erreur, ni warning.

3) Il ne reste plus qu'à le lancer :
./plop.exe

... ce qui donne comme espéré :
plop !

Attention, gros piège sous windows pour l'étape (3) (exécution) :

- Tu peux lancer ce programme via les commandes ms-dos (démarrer exécuter cmd, puis tu te places dans le bon répertoire avec la commande cd et tu lances le programme) et tout se passera bien.

- Mais si tu le lances depuis l'explorateur, windows lance les commandes ms-dos, le programme, celui-ci se termine, rend la main, et il ferme les commandes ms-dos (et concrètement tu n'as rien eu le temps de voir). Il faut donc mettre une "pause" juste avant la fin du programme si tu veux lancer ton exécutable de cette manière :
#include <stdio.h>

int main(){
    printf("plop !\n");

    getchar(); /* le programme n'avance plus tant qu'on appuie pas sur une touche */
    return 0;
}


Trouver de la documentation et des informations en C/C++

J'ai entendu parler de shellexecute() et d'autres fonctions mais je ne comprend pas vraiment comment faire.

Alors il faut bien voir qu'en C, toutes les fonctions standards (les fonctions de la lib C) sont documentées. Sous linux il suffit de passer par les man. Par exemple pour savoir ce que fait printf il suffit de taper :
man printf

Sous windows on n'est pas aussi bien équipé, et il faut taper ça par exemple dans google pour tomber sur la documentation correspondante :
https://www.google.com/search?q=man+printf&ie=utf-8&oe=utf-8&aq=t&rls=org.debian:fr:unofficial&client=iceweasel-a&gws_rd=ssl
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/sprintf.3.html

De la même façon tu peux voir comment utiliser shellexecute (et tu verras que ce n'est pas standard). En fait on utilise plutôt les fonctions execve ou execvp. Tu peux trouver pas mal d'exemples sur google encore une fois :
http://www.linux-kheops.com/doc/man/manfr/man-ascii-0.9/man3/execvp.3.txt.html
https://www.google.com/search?hl=fr&client=iceweasel-a&rls=org.debian%3Afr%3Aunofficial&q=exemple+execvp&btnG=Rechercher&lr=&gws_rd=ssl
http://sardes.inrialpes.fr/~mossiere/Telecom/Systeme/minishell/td_shell.pdf

Plus loin avec la compilation

Si un environnement de développement permet au travers d'un "nouveau projet" de gérer ton code de sorte à le compiler entièrement, tu te doutes qu'il doit compiler chaque fichier .c et assembler le tout. Lorsqu'on ne dispose pas d'environnement de développement, afin d'éviter de taper manuellement un "gcc" par fichier source, on fait un fichier "makefile" qui s'occupe de décrire comment construire l'exécutable.

Étant donné que tu débutes je ne vais pas rentrer dans les détails, mais en pratique tu es sensé en écrire un en plus de tes fichiers C/C++ afin que ton code soit simple à compiler. En effet, si ce fichier est correctement écrit, il suffit de lancer le makefile pour construire intégralement le programme. Sous linux on tape simplement :
make

(puis ensuite on exécute le programme).

Bonne chance
4
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
12 nov. 2008 à 03:32
Roh la vache... Ya des messages qui méritent d'aller dans la faq parfois....
Vive Mamie!
0
meci pour cette aide
0
mamiemando Messages postés 33076 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 avril 2024 7 748
13 nov. 2008 à 00:38
Heureuse d'avoir éclairé ta lanterne ;-)

Puisque tu juges que mon message le mérite, je vais suivre ton conseil kilian et mettre cet article dans la faq après l'avoir remis en forme.

Bonne continuation à tout les deux
2
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
13 nov. 2008 à 01:16
+1 ;-)
0
Isendil Messages postés 799 Date d'inscription lundi 14 janvier 2008 Statut Membre Dernière intervention 5 mai 2013 22
12 nov. 2008 à 13:02
Merci beaucoup, même si je me suis mal exprimé... Je cherchais effectivement des infos sur shellexecute ou assimilés (dans mon cas, c'était plutôt execve apparemment).
Merci beaucoup pour cet énorme "article", même si je connaissais à peu près comment marchait la compilation, j'en sais bien plus maintenant !
0
mamiemando Messages postés 33076 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 avril 2024 7 748
13 nov. 2008 à 02:29
Pour les curieux c'est ici, n'hésitez pas à améliorer le texte, c'est sûrement améliorable.
http://www.commentcamarche.net/faq/sujet 14440 la compilation et les modules en c et en c
0