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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut [pb static library Linux] mon projet de programme avec GUI et mon approche MVC (Model View Controller).
    Salut les C,

    comme le dit le titre je suis en train de construire un programme et j'ai opter pour approche de type MVC (Model View Controller).

    C.a.d que j'ai décider de scinder le code en 3 parties bien distinctes:

    1. La partie traitement des données du programme (Model).

    2. La partie concernant le code de l'interface graphique (View).

    3. La partie faisant la liaison entre les deux (Controller).

    Les 3 parties étant complètement séparées.


    Et j'ai bien sur un problème, mais ce n'est pas directement lié a l'approche MVC mais d'un tout autre ordre.


    Voila maintenant que le travail est fait j'aimerai compiler le code Model sous forme de library statique.

    Le problème est que je ne suis pas certains du tout, après expérience, de vraiment savoir ce qu'est une library statique, comment parvenir a la compiler correctement et surtout comment l'intégrer dans mon programme.

    Car je pensais que une library statique (qui est un fichier de type archive ar dans mon cas (Linux)) pouvait simplement se passer au compilateur comme un fichier objet (*.o) mais cela ne fonctionne pas malheureusement .

    J'arrive a compiler mes sources sous forme de library statique avec le code suivant:

    Admettons les fichiers suivant.

    Fichier libmyprog.hpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #ifndef LIB_MY_PROG_HH
    #define LIB_MY_PROG_HH
     
    #include <cstdio>
     
    void print_it() ;
     
    #endif
    Fichier libmyprog.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include "libmyprog.hpp"
     
    void print_it() {
     
      fprintf(stdout,"It Works\n") ;
    }
    Fichier main.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "libmyprog.hpp"
     
    int main(int argc, char *argv[]) {
     
      print_it() ;
     
      return 0 ;
     
    }
    Fichier Makefile:
    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
    21
    22
    23
    24
    LIB_SOURCE_FILE   = libmyprog.cpp
     
    LIB_OUTPUT_FILE_O = libmyprog.o
     
    LIB_OUTPUT_FILE_A = libmyprog.a
     
    PRG_SOURCE_FILE   = main.cpp
     
    CXX               = g++
     
    CXXFLAGS_OBJ      = -std=c++11 -c
     
    CXXFLAGS_PRG      = -std=c++11 -o my_prog
     
    obj:
    	$(CXX) $(CXXFLAGS_OBJ) $(LIB_SOURCE_FILE) 
    static:
    	ar rcs $(LIB_OUTPUT_FILE_A) $(LIB_OUTPUT_FILE_O)
    	ranlib $(LIB_OUTPUT_FILE_A)
    exec:
    	$(CXX) $(CXXFLAGS_PRG) $(LIB_OUTPUT_FILE_A) $(PRG_SOURCE_FILE)
    clean:
    	rm *.a 
    	rm *.o
    NB:
    Si vous pensez que je ne suis pas dans le bon forum: code C++.
    Je l'ai fait exprès espérant trouver plus d'aide sur le sujet d'utilisation d'une library statique (Linux) auprès de la communauté C du forum
    malgré que j'aurai bien poster dans les deux forums a la fois.

    Bon c'est facile, il suffit d'entrer les commandes suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ make obj
    g++ -std=c++11 -c libmyprog.cpp
    $ make static
    ar rcs libmyprog.a libmyprog.o
    ranlib libmyprog.a
    $ make exec
    g++ -std=c++11 -o my_prog libmyprog.a main.cpp
    /tmp/ccfflfod.o: dans la fonction « main »:
    main.cpp:(.text+0x10): référence indéfinie vers « print_it() »
    collect2: error: ld returned 1 exit status
    make: *** [exec] Erreur 1
    Pour voir le plantage...

    Alors c'est donc une erreur de linking et c'est dû au fait que je désire utilisé une library statique pensant bêtement la passer en ligne de commande au compilateur comme ont passe un fichier objet.

    Soit dit en passant que si je remplace $(LIB_OUTPUT_FILE_A) par $(LIB_OUTPUT_FILE_O) le programme se compile sans problème.

    ajoutons,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    exec2:
    	$(CXX) $(CXXFLAGS_PRG) $(LIB_OUTPUT_FILE_O) $(PRG_SOURCE_FILE)
    a notre Makefile.

    Et tapons les commandes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ make exec2
    g++ -std=c++11 -o my_prog libmyprog.o main.cpp
    $ ./my_prog
    It Works
    Je ne sais pourquoi j'ai pris un fichier archive ar (libmyprog.a: current ar archive) pour un fichier objet et pourquoi il faudrait linker une archive...???

    Mais je suis tout ouïe de vos réponses, et j'aimerai beaucoup entendre vos explications sur le sujet de mon plantage de programme.

    Merci pour vos réponses éclairées illuminant les ténèbres de mon ignorance.

    Sur ce bon code C (ou C++) a vous et bon week-end.

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Je pense que le problème vient de la manière dont tu compiles / linkes avec ta bibliothèque. Je pense que . n'est pas dans le path de LD par défaut.

    Voir : https://gradot.wordpress.com/2013/11...statique-en-c/

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Luke spywoker Voir le message
    Fichier Makefile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    exec:
    	$(CXX) $(CXXFLAGS_PRG) $(LIB_OUTPUT_FILE_A) $(PRG_SOURCE_FILE)
    Salut

    Ton seul soucis vient de l'ordre des flags dans la cible "exec". La syntaxe générale d'une compilation avec librairies, c'est gcc source.c librairies -o exec. Or toi, tu as écrit gcc -o exec librairies source.c. Le compilo ne comprend donc rien à ce que tu veux faire
    Remplace les règles de ta cible par celles-là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    exec:
    	$(CXX) $(PRG_SOURCE_FILE) $(LIB_OUTPUT_FILE_A) $(CXXFLAGS_PRG)
    et ça compilera...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut clair et net.
    Merci pour la réponse clair, net et précise et pour le lien.

    Du coup tout rentre dans l'ordre.

    Et je sais le faire désormais et les explications concernant la mystérieuse
    libmyprog.a: current ar archive
    viendront après la solution du problème peut-être, car bizarrement je m'attendais pas du tout a ce type de réponse.

    C'est vite régler mais il faut comprendre que si j'aurai jamais demandé j'aurai peut être compiler dans l'ordre sans faire exprès car disons que ça ne m'a qu'a peine effleurer l'esprit que ça avait un ordre, la ligne de compilation disons que:

    c'est autant logique que de mettre le fichier objet avant le fichier source utilisant le code machine de celui-ci

    que

    de mettre la library, qui doit du coup être lier dynamiquement, après le fichier code source l'utilisant...

    C'est comme séparer `pkg-config --cflags mylib` et `pkg-config --libs mylib`.

    Merci c'est résolu, et bon code C a vous.

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

Discussions similaires

  1. [XL-2010] Imbriquer un bout de code à mon projet (Rechercher Date avec Find-Méthode)
    Par Madwinn dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 04/02/2015, 09h45
  2. Réponses: 0
    Dernier message: 20/11/2014, 12h58
  3. comment éxécuter un mini programme avec GUI ?
    Par maammeur dans le forum Interfaces Graphiques
    Réponses: 5
    Dernier message: 31/07/2009, 23h48
  4. programmer avec GUI Matlab
    Par slayer21 dans le forum Interfaces Graphiques
    Réponses: 32
    Dernier message: 12/05/2009, 16h03

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