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

Bibliothèques, systèmes et outils C Discussion :

Compiler et utiliser une bibliothèque


Sujet :

Bibliothèques, systèmes et outils C

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut Compiler et utiliser une bibliothèque
    Bonjour à tous,

    Désolé par avance mais l'explication va être un peu longue.

    Je précise que je suis débutant en C . Je travaille avec Code::Blocks sous Linux (Xubuntu 9.10).

    Dans le cadre d'un projet scientifique je dois utiliser un simulateur hydraulique ( qui permet de calculer débits, pressions, pertes de charges et plus encore à partir des caractéristiques du réseau).

    La difficulté, c'est que ce simulateur doit être appelé par un autre algo écrit en C pour Linux. J'ai donc trouvé une version avec les fichiers source pour Linux d'un simulateur hydraulique appelé EPANET.

    Les explications fournies avec les fichiers sources sont disponibles ici.

    Les fichiers sources eux-mêmes sont téléchargeables ici.

    J'ai donc suivi les instructions de la section "Building the EPANET Toolkit from source" pour compiler la bibliothèque (on obtient bien une bibliothèque et les headers correspondants).
    Avant compilation, j'avais jeté un oeil au fichier principal epanet.c et apparemment on peut le compiler soit pour Windows soit pour Linux. Il y a une ligne #define LINUX que j'ai dé-commentée et une ligne #define DLL (pour Windows) que j'ai commentée (comme expliqué dans les commentaires du fichier). C'est peut-être un peu confus comme explication donc, si vous avez le temps d'y jeter un coup d'oeil, ouvrez-le fichier et vous comprendrez.

    Afin de tester si ma bibliothèque fonctionne, j'ai créé un petit programme tout simple pour appeler la fonction principale de la bibliothèque.

    Auparavant j'ai créé un fichier d'entrée (pour décrire le réseau) comme expliqué dans la documentation d'EPANET (cf. Appendix C p. 139).
    Petite précision: à l'origine, ce programme avec son interface graphique ne tourne que sous Windows et la notice fait donc référence à l'utilisation en ligne de commande. Mais je ne vois pas pourquoi le mec qui a adapté ça pour compiler avec GCC aurait changé le fonctionnement du programme...

    Bref mon petit programme ça donne ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "toolkit.h"
     
    int main()
    {
        char *inputFile = "2L_EPANET_INPUT", *outputFile = "2L_EPANET_OUTPUT";
        ENepanet(inputFile, outputFile, NULL, NULL);
        return 0;
    }
    Le prototype de la fonction ENepanet est le suivant:

    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
    16
    17
    18
    19
    20
     
    int DLLEXPORT ENepanet(char *f1, char *f2, char *f3, void (*pviewprog) (char *))
     
    /*------------------------------------------------------------------------
    **   Input:   f1 = pointer to name of input file
    **            f2 = pointer to name of report file
    **            f3 = pointer to name of binary output file
    **            pviewprog = see note below
    **   Output:  none
    **  Returns: error code
    **  Purpose: runs a complete EPANET simulation
    **
    **  The pviewprog() argument is a pointer to a callback function
    **  that takes a character string (char *) as its only parameter.
    **  The function would reside in and be used by the calling
    **  program to display the progress messages that EPANET generates
    **  as it carries out its computations. If this feature is not
    **  needed then the argument should be NULL.
    **-------------------------------------------------------------------------
    */

    Petite remarque déjà, le coup des pointeurs sur char je ne connais pas. Dans le tuto que j'ai suivi, on utilisait des pointeurs sur FILE.
    J'ai supposé qu'il suffisait de mettre le nom des fichiers et placer lesdits fichiers dans le même répertoire.

    Mais le vrai problème c'est que mon fichier de sortie reste désespérément vide!
    Il n'y a même pas de console qui s'ouvre pour le débogage d'EPANET donc je suppose que l'appel à la fonction de la bibliothèque ne fonctionne même pas!

    Pour compléter le tableau, voilà ce que me dit Code::Blocks:

    Linking console executable: bin/Release/Test
    /bin/sh/: g++: not found
    Process terminated with status 127 (0 minutes, 1 seconds)
    0 errors, 0 warnings

    Je ne comprends pas le "g++: not found"! Normalement, la bibliothèque que j'ai a été compilée avec GCC et c'est aussi GCC qui est utilisé pour compiler mon projet dans Code::Blocks. En plus, vu le nom, g++ doit être un compilateur C++ alors qu'il me semble que ma bibliothèque est en C vu qu'elle est compilée avec GCC (mais mes connaissances dans ce domaine sont pire que vagues, alors...).


    Bref, cela fait beaucoup de questions et je n'ai peut-être pas le niveau pour faire tout ça mais je dois avancer dans mon projet qui repose là-dessus.
    Donc si vous avez le temps de vous pencher sur mon problème et de me donner un coup de main, je vous en serais très reconnaissant.

    Merci au moins de m'avoir lu jusque là!

  2. #2
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut
    Ton projet est reconnu comme un projet C++ dans Code::Blocks. Il faudrait que tu regardes la configuration du projet, tu dois pouvoir forcer l'utilisation de gcc, ou faire reconnaître ton projet comme un projet C. Tu t'es peut-être trompé en créant le projet, ça arrive.

    Si tu veux bien te former pour apprendre la langage C voir plutôt ces cours et tutoriels pour apprendre le langage C.

    PS : projet EPANET (est pas net), c'est un beau nom
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut
    Citation Envoyé par ManusDei Voir le message
    Ton projet est reconnu comme un projet C++ dans Code::Blocks. Il faudrait que tu regardes la configuration du projet, tu dois pouvoir forcer l'utilisation de gcc, ou faire reconnaître ton projet comme un projet C. Tu t'es peut-être trompé en créant le projet, ça arrive.


    PS : projet EPANET (est pas net), c'est un beau nom
    Pourtant quand je regarde dans "Build Options" c'est bien "GNU GCC Compiler" qui est sélectioné donc c'est un projet C,non? Comment je vois ça sinon?

    EDIT: j'ai recréé un autre projet en faisant bien attention de sélectionner le langage C et j'ai toujours le même problème du "g++: not found"!

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut
    Bon apparemment c'est parce que je n'avais pas indiqué ou se trouvait la bibliothèque en question au linker.
    Ça peut paraitre bête mais comme c'était la première fois que je le faisais...

    Si jamais cela arrive à un autre débutant comme moi, dans Code::Blocks, clic droit sur votre projet, Build Options puis onglet Linker Settings.

    Si vous le faites en ligne de commande, il suffit d'ajouter le nom de votre bibliothèque (en spécifiant le répertoire dans lequel chercher si elle ne se trouve pas dans le même que votre fichier .c):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -Irépertoire_bibliothèque votre_fichier.c votre_bibliothèque.a

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 30/12/2009, 14h50
  2. Réponses: 11
    Dernier message: 31/08/2007, 10h11
  3. Utiliser une bibliothèque C++ en java
    Par khayyam90 dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 08/02/2007, 14h40
  4. utiliser une bibliothèque....
    Par miminou dans le forum Bibliothèques
    Réponses: 5
    Dernier message: 18/12/2005, 20h26
  5. Utiliser une bibliothèque statique
    Par djflex68 dans le forum MFC
    Réponses: 6
    Dernier message: 15/08/2005, 19h26

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