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 C++ Discussion :

Utilisation correcte d'une librairie externe


Sujet :

Bibliothèques C++

  1. #1
    Membre actif
    Avatar de guatto
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 179
    Points : 226
    Points
    226
    Par défaut Utilisation correcte d'une librairie externe
    Bonjour tout le monde,

    comme l'indique le titre, je cherche à connaître la méthode qu'on utilise pour importer une librairie externe (Par exemple à partir de GitHub) et de l'utiliser dans mon projet et le tout sans passer par un IDE (donc pas de CMake). Pour être plus précis, j'aimerais pouvoir passer par le compilateur g++ directement (invite de commande), bien sûr, je ne veux pas non plus réinventer la roue, je cherche simplement à comprendre le fonctionnement de ces opérations. Comme exemple j'ai choisi la librairie fltk-1.3.5. Tout ce que je sais pour le moment, corrigez-moi si je me trompe, c'est que pour utiliser une quelconque libraire (d'une manière dynamique) on a besoin des fichiers d'en-tête (/Include) et des fichiers compilés (/Lib) et éventuellement des (.dll). Mais le souci c'est que je ne sais absolument pas comment avoir certains de ces fichiers, une fois les sources téléchargées, je bloque !

    Pour ma défense, j'ai lu ce guide et je remercie grandement son auteur, mais la libraire que j'ai citée plus haut ne respecte pas l'architecture expliquée dans le guide.

    Merci de bien vouloir m'aider !

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Pas de CMake (qui n'est d'ailleurs pas un IDE) ? Pourquoi se faire du mal alors que la lib est sur Github et qu'elle offre un CMakeLists.txt ?

    Spoiler :
    Ces quelques lignes doivent limite suffir :

    Code cmake : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    include(FetchContent)
     
    FetchContent_Declare(
            fltk
            GIT_REPOSITORY https://github.com/fltk/fltk.git
            GIT_TAG release-1.3.4-2
    )
     
    FetchContent_MakeAvailable(fltk)
     
    add_executable(${PROJECT_NAME}
            main.cpp
            )
     
    target_link_libraries(${PROJECT_NAME} PRIVATE fltk)

  3. #3
    Membre actif
    Avatar de guatto
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 179
    Points : 226
    Points
    226
    Par défaut
    D'abord un grand merci pour cette réponse rapide. J'ai peut-être été moins précis dans mon explication, pour moi, utiliser CMake c'est être obligé d'utiliser un IDE, c'est ainsi que je conçois cet outil d'automatisation, et je peux me tromper bien sûr. Pour en revenir à votre réponse, je m'en excuse mais je n'ai pas vraiment de bases en CMake, tout ce que je sais faire, si je puis dire, c'est utiliser son interface (cmake-gui) et ce dernier m'oblige à choisir un IDE pour générer un build, et même en choisissant Code::Blocks, voilà ce que j'obtiens en sortie :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
     
    The C compiler identification is GNU 8.1.0
    The CXX compiler identification is GNU 8.1.0
    Detecting C compiler ABI info
    Detecting C compiler ABI info - done
    Check for working C compiler: C:/mingw32/bin/gcc.exe - skipped
    Detecting C compile features
    Detecting C compile features - done
    Detecting CXX compiler ABI info
    Detecting CXX compiler ABI info - done
    Check for working CXX compiler: C:/mingw32/bin/g++.exe - skipped
    Detecting CXX compile features
    Detecting CXX compile features - done
    CMake Deprecation Warning at CMakeLists.txt:25 (cmake_minimum_required):
      Compatibility with CMake < 2.8.12 will be removed from a future version of
      CMake.
     
      Update the VERSION argument <min> value or use a ...<max> suffix to tell
      CMake that the project does not need compatibility with older versions.
     
     
    Check if the system is big endian
    Searching 16 bit integer
    Looking for sys/types.h
    Looking for sys/types.h - not found
    Looking for stdint.h
    Looking for stdint.h - not found
    Looking for stddef.h
    Looking for stddef.h - not found
    Check size of unsigned short
    Check size of unsigned short - failed
    Check size of unsigned int
    Check size of unsigned int - failed
    Check size of unsigned long
    Check size of unsigned long - failed
    CMake Error at C:/CMake/share/cmake-3.19/Modules/TestBigEndian.cmake:50 (message):
      no suitable type found
    Call Stack (most recent call first):
      CMake/setup.cmake:92 (TEST_BIG_ENDIAN)
      CMakeLists.txt:36 (include)
     
     
    Configuring incomplete, errors occurred!
    See also "D:/Téléchargements/Compressed/fltk-1.3.5/build/CMakeFiles/CMakeOutput.log".
    See also "D:/Téléchargements/Compressed/fltk-1.3.5/build/CMakeFiles/CMakeError.log".

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Tu peux utiliser CMake en ligne de commandes pour générer des Makefiles et ensuite travailler en ligne de commande et Notepad si tu le souhaites. Je n'utilise jamais CMake GUI.

    A titre d'exemple, j'ai poussé sur GitHub un projet qui builde CMake. Il y a juste un main.cpp et un CMakeLists.txt qui va récupérer 3 dépôts sur GitHub. Il builde les bibliothèque et mon programme. Dans le README.md, tu verras les qq lignes de commandes suffisantes pour builder toute ça (ça utilise Ninja au lieu de Makefile mais c'est facile à changer en mettant -G"MinGW Makefiles" à la place de -G Ninja) : https://github.com/Bktero/HelloWorldWithDearImGui/

    On dirait que tu as une très vieille version de CMake sur ton PC. Que te renvoie la commande cmake --version ? La dernière version à ce jour est 3.19.4. En dessous de 3.x, on parle de préhistoire

    Tu as un fichier CMakeLists.txt à nous montrer ?

    Si tu débutes, je ne peux que trop te conseiller de t'intéresser à CMake. C'est clairement en train de devenir la façon standard de builder sur C++.

    EDIT :

    - Je te conseille très fortement de te mettre un autre dossier, pour éviter les accents dans le chemin complet.
    - Tu devrais utiliser http://mingw-w64.org/doku.php au lieu de mingw32, ce dernier tombant en désuétude.
    - Tu as peut-être une version 3.19 en fait.

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Je viens de faire :

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    git clone https://github.com/fltk/fltk.git
    cmake fltk -B build -G"MinGW Makefiles"
    cmake --build build

    Sur mon poste pour info :

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $ g++ --version
    g++ (MinGW-W64 x86_64-posix-dwarf, built by Brecht Sanders) 9.2.0
    Copyright (C) 2019 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     
    $ cmake --version
    cmake version 3.17.3
     
    CMake suite maintained and supported by Kitware (kitware.com/cmake).

    Tout fltk se builde comme il faut :

    Code bash : 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
     
    $ ls build\lib\
    libfltk.a  libfltk_forms.a  libfltk_gl.a  libfltk_images.a  libfltk_jpeg.a  libfltk_png.a  libfltk_z.a
     
    $ ls build/bin/*
    build/bin/fltk-config*  build/bin/fluid.exe*
     
    build/bin/test:
    adjuster.exe*  cairo_test.exe*     device.exe*         gl_overlay.exe*    keyboard.exe*            offscreen.exe*       resize-example1.exe*   subwindow.exe*    unittests.exe*
    animated.exe*  checkers.exe*       doublebuffer.exe*   glpuzzle.exe*      label.exe*               output.exe*          resize-example2.exe*   sudoku.exe*       utf8.exe*
    arc.exe*       clock.exe*          editor.exe*         hello.exe*         line_style.exe*          overlay.exe*         resize-example3a.exe*  symbols.exe*      valuators.exe*
    ask.exe*       colbrowser.exe*     fast_slow.exe*      help_dialog.exe*   list_visuals.exe*        pack.exe*            resize-example3b.exe*  table.exe*        windowfocus.exe*
    bitmap.exe*    color_chooser.exe*  file_chooser.exe*   icon.exe*          mandelbrot.exe*          pixmap.exe*          resize-example3c.exe*  tabs.exe*
    blocks.exe*    cube.exe*           fltk-versions.exe*  iconize.exe*       menubar.exe*             pixmap_browser.exe*  resize-example4a.exe*  threads.exe*
    boxtype.exe*   CubeView.exe*       fonts.exe*          image.exe*         message.exe*             preferences.exe*     resize-example4b.exe*  tile.exe*
    browser.exe*   cursor.exe*         forms.exe*          inactive.exe*      minimum.exe*             radio.exe*           rotated_text.exe*      tiled_image.exe*
    button.exe*    curve.exe*          fractals.exe*       input.exe*         native-filechooser.exe*  resize.exe*          scroll.exe*            tree.exe*
    buttons.exe*   demo.exe*           fullscreen.exe*     input_choice.exe*  navigation.exe*          resizebox.exe*       shape.exe*             twowin.exe*

    J'ai vu passer dans mes logs les mêmes messages que toi mais je n'ai pas eu d'erreurs. Je pense que c'est parce que j'ai mingw64.

    Au final, j'ai les libs prêtes à être réutilisée, avec ou sans CMake, et les programmes de test

  6. #6
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Cmake-gui n'oblige pas à choisir un IDE, mais un générateur (Ninja, Makefile ou des projets pour les IDEs), simplement parce cmake ne s'occupe pas lui-même du build, mais délègue la tache à un logiciel spécialisé. Pour une compilation hors IDE le mieux étant ninja ou un makefile (même si ce dernier est plus lent).

  7. #7
    Membre actif
    Avatar de guatto
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 179
    Points : 226
    Points
    226
    Par défaut
    J'ai suivi votre méthode de compilation en choisissant un répertoire sans accents et sans espaces et le build s'est bien déroulé (MERCI), j'ai utilisé les commandes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    cmake -B build -G "MinGW Makefiles"
    cmake --build build
    Maintenant je me retrouve avec un autre problème, j'ai eu un dossier "build" qui contient un sous dossier "lib" dans lequel se trouvent les fichiers compilés (.a), j'ai donc créé un autre dossier "include" dans lequel j'ai mis les fichiers d'en-tête puis j'ai essayé cet exemple :

    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
    25
    26
    27
    28
    29
     
     
    #include <FL/Fl.H>
    #include <FL/Fl_Box.H>
    #include <FL/Fl_Window.H>
     
    namespace Examples {
      class Main_Window : public Fl_Window {
      public:
        Main_Window() : Fl_Window(200, 100, 300, 300, "Hello world (box)") {
          box1.align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE | FL_ALIGN_CLIP);
          box1.labelfont(FL_HELVETICA_BOLD_ITALIC);
          box1.labelsize(36);
          box1.labelcolor(fl_rgb_color(0x00, 0x80, 0x00));
     
          resizable(this);
          position((Fl::w() - w())/2, (Fl::h() - h())/2);
        }
     
      private:
        Fl_Box box1 {5, 100, 290, 100, "Hello, World!"};
      };
    }
     
    int main(int argc, char *argv[]) {
      Examples::Main_Window window;
      window.show(argc, argv);
      return Fl::run();
    }
    en lançant cette commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    g++ -std=c++11 -L./lib -I./include Main.cpp -o Test -lfltk -lfltk_forms -lfltk_gl -lfltk_images
    Et là j'ai toute une liste d'erreurs du genre : "undefined reference to `_imp__SetTextColor@8'"

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    C'est le problème du C/ C++

    Tu as 2 stratégies pour 1 bibliothèque :
    1) Si tu as le code source, tu peux intégrer son code dans ton projet/ ta solution (même si tu isoles cette dépendance dans 1 dossier libraries avec d'autres et 1 dossier virtuel dans ton IDE)
    Tu compiles tout en même temps et cela revient au même qu'1 bibliothèque statique
    Le problème c'est le temps de compilation complet (<- parce les IDEs savent ne recompiler que les sources qui ont modifiées

    2) Si tu n'as que les entêtes, des bibliothèques statiques/ dynamiques/ partagées (Windows)
    Il faut configurer correctement ton projet/ ta solution pour les trouver

    Et ton problème est là : tu as mis des chemins relatifs. Mais relatif à quel dossier ?
    Parce que tu dois compiler à partir de la racine, mais comme tu le dis ton dossier lib est dans 1 dossier build

    Visual C++ a des variables d'environnement pour pallier ceci : $(SolutionDir), $(ProjectDir), ...

  9. #9
    Membre actif
    Avatar de guatto
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 179
    Points : 226
    Points
    226
    Par défaut
    Voici l'arborescence de mon projet :

    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
     
    Projet
       |
       |--Main.cpp
       |
       |--/include
       |     |
       |     |--/cairo
       |     |--/FL
       |     |--/GL
       |     |--/jpeg
       |     |--/..
       |
       |--/lib
       |     |
       |     |--libfltk.a
       |     |--libfltk_forms.a
       |     |--libfltk_gl.a
       |     |--libfltk_images.a
       |     |--libfltk_jpeg.a
       |     |--libfltk_png.a
       |     |--libfltk_z.a
    J'ai loupé un truc ?

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Ca me semble correct, même si ta ligne de commande n'utilise pas tous les *.a.

    Essaye avec -Wl,--start-group -lfltk -lfltk_forms -lfltk_gl -lfltk_images -Wl,--end-group.

  11. #11
    Membre actif
    Avatar de guatto
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 179
    Points : 226
    Points
    226
    Par défaut
    Ça ne fonctionne toujours pas, je crois que ça a un rapport avec cette entrée ( fltk-config ) sur la documentation ils disent qu'on doit ajouter un genre de script pour avoir les options requises à la compilation, et j'ai même remarqué qu'il fallait ajouter d'autres paramètres -lXext -lX11 -lm, j'ignore où les trouver, le problème persiste donc !

Discussions similaires

  1. Utilisation d'une librairie externe sous VS2012
    Par morgan_2956 dans le forum Débuter
    Réponses: 6
    Dernier message: 28/10/2014, 11h58
  2. utilisation d'une librairie externe
    Par Fidvir dans le forum MATLAB
    Réponses: 0
    Dernier message: 12/03/2008, 17h10
  3. Réponses: 3
    Dernier message: 03/01/2008, 09h53
  4. [Outils][VS2005] Comment utiliser une librairie externe ?
    Par Djangogol dans le forum EDI/Outils
    Réponses: 4
    Dernier message: 25/05/2006, 11h12
  5. Creer et utiliser une librairie externe à l'exécutable
    Par multani dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 06/11/2003, 10h11

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