IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Compilation du programme Velena


Sujet :

C

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 844
    Points : 13 776
    Points
    13 776
    Billets dans le blog
    8
    Par défaut Compilation du programme Velena
    Bonjour !

    Je cherche un moyen de compiler pour Windows le programme Velena. C'est un programme qui joue parfaitement à Puissance 4 (comme cela est expliqué dans la documentation, très intéressante d'ailleurs). On peut télécharger une version compilée avec interface graphique (qui nécessite un émulateur DOS) mais aussi le code source du moteur seul, pour une utilisation par ligne de commande.

    C'est la version "console" qui m'intéresse. Cependant en C je n'ai jamais fait que des petits programmes tenant dans un seul fichier, donc je ne sais pas trop comment m'y prendre. J'ai fait un essai avec Visual C++ 2010, mais apparemment le code n'est pas compatible avec ce compilateur (et je n'ai aucune idée des modifications qu'il faudrait faire). J'ai fait aussi quelques tentatives avec MinGW GCC mais sans plus de succès.

    Je me suis dit que le problème intéresserait peut-être quelqu'un. En tout cas, le code vaut le coup d'œil.

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    4 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : juin 2009
    Messages : 4 385
    Points : 13 232
    Points
    13 232
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Avec les sources, il y a un fichier nommé makefile. C'est un point d'entrée pour l'utilitaire make, qui va alors construire l'exécutable à partir des sources. Sous Unix, il te suffit de faire make pour la magie opère. Si tu as installé MinGW sous Windows, il doit y avoir un équivalent de make. Tu devrais pouvoir t'en sortir facilement avec cela

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 844
    Points : 13 776
    Points
    13 776
    Billets dans le blog
    8
    Par défaut
    @Bktero

    Merci pour la réponse. OK, je me lance sur cette piste.

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 844
    Points : 13 776
    Points
    13 776
    Billets dans le blog
    8
    Par défaut
    Bien, j'ai essayé d'utiliser tel quel le fichier MAKEFILE, de deux façons.

    1° Avec la ligne suivante (collée dans un fichier build.cmd se trouvant dans le même répertoire que le code source) :

    Code batch : Sélectionner tout - Visualiser dans une fenêtre à part
    c:\mingw\bin\mingw32-make.exe -f MAKEFILE >> build.txt 2>&1

    J'obtiens l'erreur suivante :

    mingw32-make: *** No rule to make target 'adjmtrx.o', needed by 'veleng'. Stop.
    2° Avec cette ligne :

    Code batch : Sélectionner tout - Visualiser dans une fenêtre à part
    c:\mingw\msys\1.0\bin\make.exe -f MAKEFILE >> build.txt 2>&1

    J'obtiens l'erreur suivante :

    gcc -c -O3 -o adjmtrx.o adjmtrx.c
    adjmtrx.c:15: No include path in which to find stdio.h
    adjmtrx.c:16: No include path in which to find string.h
    adjmtrx.c:17: No include path in which to find stdlib.h
    adjmtrx.c:18: No include path in which to find malloc.h
    In file included from adjmtrx.c:24:
    pnsearch.h:1: No include path in which to find time.h
    make: *** [adjmtrx.o] Error 1
    Voyant cela, je me suis inspiré du fichier MAKEFILE pour essayer de construire une ligne de commande directement dans mon fichier batch :

    Code batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set path=c:\mingw\bin
     
    c:\mingw\bin\gcc.exe adjmtrx.c connect4.c error.c ia_main.c pnsearch.c bintree.c database.c evaluate.c pbsolver.c wc.c buildob.c dummy.c heurist.c playgame.c cmdline.c -o veleng >> build.txt 2>&1

    Cette fois j'obtiens comme résultat une foule d'avertissements et quelques erreurs qui sont presque toutes du même type, à savoir :

    CONNECT4.C: In function 'void initboard(board*)':
    CONNECT4.C:119:12: error: 'randomize' was not declared in this scope
    randomize();
    ^
    Voilà où j'en suis. Je vais voir si je peux comprendre cette erreur et éventuellement trouver le moyen de la corriger, peut-être en modifiant le code.

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 844
    Points : 13 776
    Points
    13 776
    Billets dans le blog
    8
    Par défaut
    Pour l'erreur relative à la fonction randomize(), j'ai fait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void randomize(); // Modification 24/02/2015
    void initboard(struct board *board)
    L'erreur n'apparaît plus. J'ai bon ? Je peux appliquer le même procédé à toutes les erreurs de ce type ?

    Ensuite j'ai eu l'erreur suivante :

    CONNECT4.C:279:29: error: '::main' must return 'int'
    J'ai fait cette correction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //void main(short ac,char **av)
    int main(short ac,char **av) // Modification 24/02/2015
    	{
    	...
            //exit(0);
            return 0;  // Modification 24/02/2015
            }
    Est-ce qu'il n'y aurait pas une option de compilation spéciale "vieux programmes" qui me permettrait de gagner du temps ?

    Y a-t-il un moyen de supprimer les avertissements pour ne voir que les erreurs ?

    Pensez-vous que je sois sur la bonne voie ? Toute suggestion est la bienvenue.

    J'aimerais bien pouvoir compiler ce programme pour pouvoir l'appeler à partir d'une interface graphique que j'ai déjà faite. Ou mieux encore, j'aimerais bien en faire une DLL, mais je n'en suis pas encore là...

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 844
    Points : 13 776
    Points
    13 776
    Billets dans le blog
    8
    Par défaut
    Ouf ! Voici les seules erreurs qui me restent :

    EVALUATE.C: In function 'void debug_black(board*)':
    EVALUATE.C:1428:11: error: 'x' does not name a type
    register x;
    ^
    EVALUATE.C: In function 'short int evaluate_black(board*)':
    EVALUATE.C:1754:11: error: 'x' does not name a type
    register x;
    ^
    EVALUATE.C: In function 'short int ss_evaluate_black(board*)':
    EVALUATE.C:1932:11: error: 'x' does not name a type
    register x;
    ^
    BUILDOB.C: In function 'void build_white_opening_book()':
    BUILDOB.C:166:47: error: invalid conversion from 'unsigned char*' to 'char*' [-fpermissive]
    if(posit>0) insert_obook_tree(blk,root);
    ^
    BUILDOB.C:61:6: error: initializing argument 1 of 'void insert_obook_tree(char*, tree_type*)' [-fpermissive]
    void insert_obook_tree(char *position,struct tree_type *curr_tree)
    ^
    Auriez-vous une idée des modifications à apporter ?

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 844
    Points : 13 776
    Points
    13 776
    Billets dans le blog
    8
    Par défaut
    Alors là je ne comprends plus rien... J'ai renommé tous les fichiers, en passant les noms en minuscules, pour distinguer les fichiers modifiés des fichiers originaux et... toutes les erreurs ont disparu. La compilation a réussi.

    P.-S. J'ai fait un deuxième essai en repartant des fichiers originaux, simplement renommés en minuscules. Avec une seule modification (deux appels de la fonction sleep() mis en commentaire), le code se compile du premier coup.

  8. #8
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 844
    Points : 13 776
    Points
    13 776
    Billets dans le blog
    8
    Par défaut
    Pour conclure, voici exactement la procédure que j'ai suivie pour compiler Velena (moteur seul) pour Windows, avec MinGW GCC.

    Premièrement, j'ai passé tous les noms de fichiers en minuscules (en utilisant cet outil).

    Ensuite j'ai ajouté deux lignes dans buildob.c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <stdlib.h>
    #include <string.h>
    Deux lignes dans pnsearch.c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <windows.h>
    #define sleep(n) Sleep(1000 * n)
    Et pour lancer la compilation je me suis servi de ce fichier (que j'ai appelé build.cmd) :

    Code BAT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    set path=c:\mingw\bin
     
    c:\mingw\bin\gcc.exe ^
      adjmtrx.c ^
      connect4.c ^
      error.c ^
      ia_main.c ^
      pnsearch.c ^
      bintree.c ^
      database.c ^
      evaluate.c ^
      pbsolver.c ^
      wc.c ^
      buildob.c ^
      dummy.c ^
      heurist.c ^
      playgame.c ^
      cmdline.c ^
      -o veleng

  9. #9
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 844
    Points : 13 776
    Points
    13 776
    Billets dans le blog
    8
    Par défaut
    Bonjour !

    J'ai marqué la discussion comme résolue parce que j'ai réussi à compiler le programme. Mais, l'appétit venant en mangeant, j'ai voulu faire autre chose, à savoir transformer l'application console en DLL (pour pouvoir l'appeler depuis un programme en Pascal).

    Pour cela j'ai modifié de la façon suivante la fonction main() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //void main(short ac, char **av)
    __declspec(dllexport) int __cdecl velenaMove(char ch[])
    {
      int answer;
      ...
      answer = playgame(ch, board);
      ...
      //exit(0);
      return answer;
    }
    Puis j'ai essayé de modifier le script dont je m'étais servi pour compiler, en m'inspirant d'un exemple trouvé dans un tutoriel sur les DLL :

    Code BAT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    @echo off
     
    set path=c:\mingw\bin
    set name=veleng
     
    c:\mingw\bin\gcc.exe -c -o %name%.o ^
      adjmtrx.c ^
      connect4.c ^
      error.c ^
      ia_main.c ^
      pnsearch.c ^
      bintree.c ^
      database.c ^
      evaluate.c ^
      pbsolver.c ^
      wc.c ^
      buildob.c ^
      dummy.c ^
      heurist.c ^
      playgame.c
     
    rem gcc.exe -o %name%.dll -s -shared %name%.o -Wl,--subsystem,windows
     
    pause

    Mais la première commande ne passe pas et me renvoie ce message d'erreur :

    gcc.exe: fatal error: cannot specify -o with -c, -S or -E with multiple files
    Auriez-vous une idée de la façon de compiler ma DLL (en supposant que mon code soit correct) ?

  10. #10
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    5 154
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 5 154
    Points : 16 968
    Points
    16 968
    Par défaut
    Comme il te le dit, gcc ne prends pas de -o avec -c pour plusieurs fichiers.
    Il faut bien comprendre que -o sert à donner le nom du fichier de sortie, et qu'il ne peut s'appliquer que lorsqu'il n'y a qu'un seul fichier de sortie.

    l'option -c permet de compiler sans faire l'édition de lien. Ca traduit donc chaque fichier fourni en autant de .o
    (de même, -E s'arrête après le passage du préprocesseur)

    pour un programme, la commande aveugle est :
    c:\mingw\bin\gcc.exe -c *.c -Wall -Wextra -O2
    c:\mingw\bin\gcc.exe *.o -o programme.exe
    
    Pour une bibliothèque
    c:\mingw\bin\gcc.exe -c *.c -Wall -Wextra -O2
    c:\mingw\bin\gcc.exe *.o -shared -Wl,--subsystem,windows -o bidule.dll
    
    sachant que je ne connaissais pas "-Wl,--subsystem,windows"

    C'est à dire compiler les sources, puis dans un second temps, en faire une bibliothèque ou un programme.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  11. #11
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 844
    Points : 13 776
    Points
    13 776
    Billets dans le blog
    8
    Par défaut
    @leternel

    Merci beaucoup pour les scripts et les explications. Je reconnais que j'ai bâti mon script sans trop comprendre ce que je faisais : maintenant je commence à y voir plus clair.

    N'étant pas chez moi, je n'ai pas le code entier du projet sous la main mais je viens de faire un test sur un petit exemple : ça fonctionne impeccablement. J'ai hâte de faire l'essai sur mon vrai code.

  12. #12
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    5 154
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 5 154
    Points : 16 968
    Points
    16 968
    Par défaut
    En fait, le script utilise gcc, dont tu trouveras la documentation fort fastidieuse dans les pages man, ou plus expliqué dans nos cours et tutoriels programmation C (je ne sais plus lesquels précisément).

    Quelques options que je n'ai pas encore expliquées:
    • -g signifie d'incorporer les informations de débuggage.
    • -O2 optimise
    • -Wall signifie d'activer tous les warnings
    • -Wextra d'activer la plupart des warnings que -Wall n'active pas. Ces warnings sont du bruit inintéressant quand il y en a venant de -Wall.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  13. #13
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 844
    Points : 13 776
    Points
    13 776
    Billets dans le blog
    8
    Par défaut
    Merci pour les informations complémentaires.

    Le script pour la compilation de la DLL fonctionne parfaitement. J'ai une magnifique DLL, avec deux exemples d'utilisation, l'un en C l'autre en Pascal. Tout semble fonctionner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    /* usedll.c */
     
    #include <stdlib.h>
    #include <stdio.h>
     
    __declspec(dllimport) int __cdecl Answer(char ch[]);
     
    int main(void)
    {
      char c[] = "c0";
     
      printf("%d\n", Answer(c)); // 4
     
      return EXIT_SUCCESS;
    }
    Code DELPHI : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    program usedll;
    {$APPTYPE CONSOLE}
    {$MODE DELPHI}
     
    uses
      Windows, SysUtils;
     
    type
      TFunction = function(c: pchar): integer; cdecl;
     
    const
      CFunction: TFunction = nil;
     
    var
      dllHandle: THandle;
      arg: array[0..255] of char;
     
    begin
      dllHandle := LoadLibrary('veleng.dll');
      if dllHandle <> 0 then
      begin
        @CFunction := GetProcAddress(dllHandle, 'Answer');
     
        StrPCopy(arg, 'c0');
        WriteLn(CFunction(@arg)); // 4
     
        FreeLibrary(dllHandle);
        ReadLn;
      end;
    end.

    Pareil pour la compilation de l'application console. J'ai mis mon premier script à la corbeille.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Outils][C#] Comment compiler un programme ?
    Par H-bil dans le forum EDI/Outils
    Réponses: 4
    Dernier message: 06/04/2007, 13h18
  2. Compiler un programme avec winapi.h
    Par mannostab dans le forum Langage
    Réponses: 2
    Dernier message: 06/10/2006, 23h06
  3. Compiler un programme perl pour palteforme Win32
    Par LE NEINDRE dans le forum Modules
    Réponses: 1
    Dernier message: 11/01/2006, 15h27
  4. [Compilation] Dev ne peut pas compiler mon programme
    Par Rémaill dans le forum Dev-C++
    Réponses: 9
    Dernier message: 01/11/2005, 01h41
  5. Delphi 2005 : Erreur de compilation du programme
    Par bigbestboy dans le forum Langage
    Réponses: 6
    Dernier message: 03/08/2005, 19h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo