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

Langage C++ Discussion :

Erreur Makefile sfml macos


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Erreur Makefile sfml macos
    Salut, j'ai besoin de votre aide les amis s'il vous plait
    Je travail sur un projet c++ en sfml, je suis sur imac (mojave 10.14.6). Avec xcode le programme compile et la fenêtre se lance sans problème, mais je ne réussi pas avec le makefile
    fatal error: SFML/Audio.hpp: No such file or directory
    5 | #include <SFML/Audio.hpp>
    voici une partie du makefile
    Code makefile :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
    CC=g++
    FLAGS=-W -Wall -lpthread -std=c++11
     
    SF_INCLUDE = -I/usr/local/include
    SF_LIB= -L/usr/local/lib -lsfml-grafics -lsfml-audio -lsfml-window -lsfml-system -lsfml-network
     
    EXE=Prog
     
    OBJS=Macros.o
     
    $(EXE): main.o $(OBJS)
    	$(CC) -o $(EXE) main.o $(OBJS) $(SF_LIB) $(FLAGS)
     
    Macros.o: Macros.hpp
    	$(CC) -o Macros.o -c Macros.cpp $(SF_INCLUDE)  $(FLAGS)
     
    main.o: main.cpp Macros.hpp
    	$(CC) -o main.o -c main.cpp $(SF_INCLUDE) $(FLAGS)
     
    cls:
    	rm -rf *.o


    Quelqu'un peut me donner la bonne version. Merci et excellente journée

  2. #2
    Rédacteur/Modérateur

    Il trouve pas le fichier parce qu'il manque certainement un -I indiquant où se trouvent les fichiers SFML.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Futur Membre du Club
    Salut et merci pour la réponse. Le -I est bien déclaré en ligne 4 dans la var SF_INCLUDE et le -L dans SF_LIB, peut etre qu'il faut les indiqué autrement ?? ?? ?

  4. #4
    Nouveau membre du Club
    Mr CaptainEd,

    Citation Envoyé par CaptainEd Voir le message
    Salut et merci pour la réponse. Le -I est bien déclaré en ligne 4 dans la var SF_INCLUDE et le -L dans SF_LIB, peut etre qu'il faut les indiqué autrement ?? ?? ?
    Donc le code de Audio.hpp est bien dans /usr/local/include/SFML/Audio.hpp; puisque SF_INCLUDE = -I/usr/local/include ?

    Bonne soirée.

  5. #5
    Futur Membre du Club
    Oui c'est tout a fait cela. Vous savez d'où vient le prob ?

    Merci et bonne soirée à vous

  6. #6
    Membre averti
    Puisqu'il semble que ton makefile soit plutôt correct, je pense que le problème est que le fichier Audio.hpp soit inexistant... Je ne vois pas autrement ...
    Peut-être que cela pourrait t'aider : https://en.sfml-dev.org/forums/index...?topic=14639.0

  7. #7
    Nouveau membre du Club
    Bonjour CaptainEd,

    Peux-tu nous renvoyer ce que donne la commande
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    ls -l /usr/local/include/SFML/Audio.hpp
    Julien Lopez
    Ingénieur de recherche à R++ : https://rplusplus.com/

  8. #8
    Futur Membre du Club
    Citation Envoyé par ABD-Z Voir le message
    Puisqu'il semble que ton makefile soit plutôt correct, je pense que le problème est que le fichier Audio.hpp soit inexistant... Je ne vois pas autrement ...
    Peut-être que cela pourrait t'aider : https://en.sfml-dev.org/forums/index...?topic=14639.0
    Merci pour le lien, je vais y jeter un oeil. Pour le fichier Audio.hpp il existe belle est bien -> /usr/local/include/SFML/Audio.hpp

    Citation Envoyé par Julien Lopez Voir le message
    Bonjour CaptainEd,

    Peux-tu nous renvoyer ce que donne la commande
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    ls -l /usr/local/include/SFML/Audio.hpp
    Oui j'ai testé la commande et cela donne :
    -rw-r--r--@ 1 utilisateur staff 2095 Oct 15 2018 /usr/local/include/SFML/Audio.hpp

    J'ai effectué quelques modifs, est maintenant il me sort une nouvelle erreur. Pour commencer voici le makefile
    Code Makefile :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
    CC=g++-9
    FLAGS=-DDEBUG -DPROD -DOZ -O3 -g -W -Wall -Werror -pedantic -ansi -Wno-deprecated -lpthread -std=c++14
    EXE=Bibi.app
     
    OBJS=Macros.o
     
     
     
    OS=$(shell uname)
    ifeq ($(OS), Darwin)
    	SFM=-I/usr/local/Cellar/sfml/2.5.1/include -L/usr/local/Cellar/sfml/2.5.1/lib -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio 
    else
        #########
    endif
     
     
    $(EXE): main.o $(OBJS)
    	$(CC) -o $(EXE) main.o $(OBJS) $(SFM) $(FLAGS)
     
     
    Macros.o: Helpers/Macros.hpp
    	$(CC) -o Macros.o -c Helpers/Macros.cpp $(SFM) $(FLAGS)
     
     
    main.o: main.cpp Helpers/Macros.hpp
    	$(CC) -o main.o -c main.cpp $(SFM) $(FLAGS)
     
     
    cls:
    	rm -rf *.o *~ *.stackdump *.exe \#*\#


    à la sortie cela donne :
    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
    g++-9 -o main.o -c main.cpp -I/usr/local/include -L/usr/local/Cellar/sfml/2.5.1/lib -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio  -DDEBUG -DPROD -DOZ -O3 -g -W -Wall -Werror -pedantic -ansi -Wno-deprecated -lpthread -std=c++14
    g++-9 -o Macros.o -c Helpers/Macros.cpp -I/usr/local/include -L/usr/local/Cellar/sfml/2.5.1/lib -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio  -DDEBUG -DPROD -DOZ -O3 -g -W -Wall -Werror -pedantic -ansi -Wno-deprecated -lpthread -std=c++14
    #g++-9 -lpthread main.cpp -o Bibi.app -I/usr/local/include -L/usr/local/Cellar/sfml/2.5.1/lib -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio 
    g++-9 -o Bibi.app main.o Macros.o -I/usr/local/include -L/usr/local/Cellar/sfml/2.5.1/lib -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio  -DDEBUG -DPROD -DOZ -O3 -g -W -Wall -Werror -pedantic -ansi -Wno-deprecated -lpthread -std=c++14
    Undefined symbols for architecture x86_64:
      "sf::Font::loadFromFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from:
          _main in main.o
      "sf::Image::loadFromFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from:
          _main in main.o
      "sf::String::String(char const*, std::locale const&)", referenced from:
          _main in main.o
      "sf::Texture::loadFromFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, sf::Rect<int> const&)", referenced from:
          _main in main.o
    ld: symbol(s) not found for architecture x86_64
    collect2: error: ld returned 1 exit status
    make: *** [Bibi.app] Error 1


    Merci d'avance

  9. #9
    Membre averti
    Citation Envoyé par CaptainEd Voir le message



    à la sortie cela donne :
    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
    g++-9 -o main.o -c main.cpp -I/usr/local/include -L/usr/local/Cellar/sfml/2.5.1/lib -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio  -DDEBUG -DPROD -DOZ -O3 -g -W -Wall -Werror -pedantic -ansi -Wno-deprecated -lpthread -std=c++14
    g++-9 -o Macros.o -c Helpers/Macros.cpp -I/usr/local/include -L/usr/local/Cellar/sfml/2.5.1/lib -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio  -DDEBUG -DPROD -DOZ -O3 -g -W -Wall -Werror -pedantic -ansi -Wno-deprecated -lpthread -std=c++14
    #g++-9 -lpthread main.cpp -o Bibi.app -I/usr/local/include -L/usr/local/Cellar/sfml/2.5.1/lib -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio 
    g++-9 -o Bibi.app main.o Macros.o -I/usr/local/include -L/usr/local/Cellar/sfml/2.5.1/lib -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio  -DDEBUG -DPROD -DOZ -O3 -g -W -Wall -Werror -pedantic -ansi -Wno-deprecated -lpthread -std=c++14
    Undefined symbols for architecture x86_64:
      "sf::Font::loadFromFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from:
          _main in main.o
      "sf::Image::loadFromFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from:
          _main in main.o
      "sf::String::String(char const*, std::locale const&)", referenced from:
          _main in main.o
      "sf::Texture::loadFromFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, sf::Rect<int> const&)", referenced from:
          _main in main.o
    ld: symbol(s) not found for architecture x86_64
    collect2: error: ld returned 1 exit status
    make: *** [Bibi.app] Error 1

    J'ai l'impression qu'il y ai une erreur d'architecture puis que les symboles ne sont pas reconnus pour x86_64. Tu as bien téléchargé sfml pour mac?

  10. #10
    Futur Membre du Club
    Citation Envoyé par ABD-Z Voir le message
    J'ai l'impression qu'il y ai une erreur d'architecture puis que les symboles ne sont pas reconnus pour x86_64. Tu as bien téléchargé sfml pour mac?
    oui bien sur, c'est des ".dylib" j'utilise g++-9 et quand je passe sur clang++ cela donne

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    clang: error: -lsfml-graphics: 'linker' input unused [-Werror,-Wunused-command-line-argument]
    clang: error: -lsfml-window: 'linker' input unused [-Werror,-Wunused-command-line-argument]
    clang: error: -lsfml-system: 'linker' input unused [-Werror,-Wunused-command-line-argument]
    clang: error: -lsfml-audio: 'linker' input unused [-Werror,-Wunused-command-line-argument]
    clang: error: -lsfml-network: 'linker' input unused [-Werror,-Wunused-command-line-argument]


    sachant que sur windows, j'arrive a la faire fonctionner

  11. #11
    Membre averti
    Malheureusement je ne peux pas plus aider.... J'ai jamais vraiment travaillé sur MAC.
    Tout ce que je peux dire c'est :
    -de tout supprimer
    -reprendre l'installation de zéro en suivant le guide officiel disponible sue le site de SFML et/ou en suivant une vidéo e tuto sur internet
    -prier pour que ça marche

  12. #12
    Futur Membre du Club
    Citation Envoyé par ABD-Z Voir le message
    Malheureusement je ne peux pas plus aider.... J'ai jamais vraiment travaillé sur MAC.
    Tout ce que je peux dire c'est :
    -de tout supprimer
    -reprendre l'installation de zéro en suivant le guide officiel disponible sue le site de SFML et/ou en suivant une vidéo e tuto sur internet
    -prier pour que ça marche
    Merci quand même, j'ai en effet remplacé les fichiers sfml en téléchargeant à nouveau la SFML-2.5.1-macos-clang, alors voila pour la copie :
    - Frameworks & extlibs -> /Library/Frameworks
    - include -> /usr/local/include
    - lib -> /usr/local/lib
    - templates -> /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/Project Templates

    Pour les flags c'est :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    -I/usr/local/include -L/usr/local/lib -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio -lsfml-network


    J'ai commencé à me demander si mon imac n'est pas du 32bits, et non c'est bien du 64 avec in i5 Bref j'y comprends rien.

    Si non s'il faut prier pour qu'un programme marche, vaut mieux que j'arrête de programmer Alors je reviens sur la SDL2 en attendant

  13. #13
    Membre expert
    Je pense que la stl utiliser pour compiler la SFML n'est pas la même que celle sur ton système. Cela ressemble à la veille ABI de gcc-5 (les erreurs sur std::__cxx11 en témoignent). Le plus simple serait de recompiler la SFML.

    Au passage, -std=c++14 et -ansi sont exclusives, seul le dernier utilisé sera pris en compte (-ansi = -std=c++98). Et -W est déprécié, il faut utiliser -Wextra.

  14. #14
    Futur Membre du Club
    Citation Envoyé par jo_link_noir Voir le message
    Je pense que la stl utiliser pour compiler la SFML n'est pas la même que celle sur ton système. Cela ressemble à la veille ABI de gcc-5 (les erreurs sur std::__cxx11 en témoignent). Le plus simple serait de recompiler la SFML.

    Au passage, -std=c++14 et -ansi sont exclusives, seul le dernier utilisé sera pris en compte (-ansi = -std=c++98). Et -W est déprécié, il faut utiliser -Wextra.
    Salut et merci pour la rép, mais est ce que tu peux etre plus précis pour la stl ??? et comment cela recompiler la sfml, il n y a que des fichiers a copier non ?

    Si non pour les flags, merci pour les conseils, et cela m'a donné l'idée d'essayer un truc. J'ai viré presque la totalité des flags, et changer les "g++-9" par "clang++" et moitié d'un miracle, cela a compilé avec quelques warnings :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    clang: warning: -lpthread: 'linker' input unused [-Wunused-command-line-argument]
    clang: warning: -lsfml-graphics: 'linker' input unused [-Wunused-command-line-argument]
    clang: warning: -lsfml-window: 'linker' input unused [-Wunused-command-line-argument]
    clang: warning: -lsfml-system: 'linker' input unused [-Wunused-command-line-argument]
    clang: warning: -lsfml-audio: 'linker' input unused [-Wunused-command-line-argument]
    clang: warning: -lsfml-network: 'linker' input unused [-Wunused-command-line-argument]
    clang: warning: argument unused during compilation: '-L/usr/local/lib' [-Wunused-command-line-argument]


    et voici le minimum du nouveau makefile :

    Code Makefile :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CC=clang++
    EXE=Bibi.app
     
    FLAGS=-DDEBUG -lpthread -std=c++14
     
    LIBSFM=-I/usr/local/include -L/usr/local/lib -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio -lsfml-network
     
     
    $(EXE): main.o $(OBJS)
    	$(CC) main.o $(OBJS) -o $(EXE) $(FLAGS) $(LIBSFM)
     
     
    main.o: main.cpp $(HEADS)
    	$(CC) -c main.cpp $(FLAGS) $(LIBSFM)


    et juste entre les (clang --version) :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Apple LLVM version 10.0.1 (clang-1001.0.46.4)
    Target: x86_64-apple-darwin18.7.0
    Thread model: posix
    InstalledDir: /Library/Developer/CommandLineTools/usr/bin


    Merci à tous

  15. #15
    Expert éminent sénior
    Salut,

    Il faut déjà faire attention à l'ordre dans lequel tu fournis les bibliothèques SFML à lier, surtout si tu utilise la version partagée (dll / so)

    Personnellement, j'ai eu pas mal de problèmes sous debian à cause de cela. Au point que j'ai décidé d'utiliser la version statique de la SFML (que j'ai du compiler et installer à la main), ce qui m'amène au point suivant

    Juste une petite question au passage:

    N'as tu jamais pensé à utiliser des outils quelconques te permettant de faciliter la création de tes fichiers Makefile, tels que CMake (je pourrais aussi te parler des autotools, mais ils sont moins faciles d'emploi )

    Car c'est très chouette d'être en mesure d'écrire son propre Makefile, mais il faut avouer que c'est parfois pour le moins fastidieux, surtout lorsque le projet a tendance à se complexifier avec le temps

    CMake te permet de décrire ton projet, avec toutes les dépendances et tout ce qui est nécessaire à la compilation correcte, sous une forme finalement relativement simple, et il va se charger lui-même de générer le Makefile.

    Par exemple, un projet vraiment basique utilisant la SFML serait composé
    d'un CMakeLists.txt (fichier utilisé par CMake) pouvant ressembler à
    Code CMakeLists :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
    47
    48
    49
    50
    51
    # determine la version minimale de CMake qui sera requise
    # Sous debian, la version installée par défaut est la version 3.13.4,
    # alors que la version actuellement disponible (en release canditate) est la 3.17.0
    # en utilisant une version "un peu plus ancienne", nous devrions pouvoir nous adapter
    # à toutes les machines <img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />
    cmake_minimum_required(VERSION 3.8)
    # définit le nom du projet (et des paquets éventuellement créés)
    project(sfml_test VERSION 1.0.0.0 # le numéro de version
                      LANGUAGES CXX   # indique que l'on utilise C++
    )
    # définit le standard utilisé pour C++, Comme C++20 est sur le point d'arriver
    # il semble "cohérent" d'utiliser au minimum C++14
    set(CMAKE_CXX_STANDARD 14)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    set(CMAKE_CXX_EXTENSIONS OFF)
     
     
    # défini le préfixe d'installation du programme créé
    set(CMAKE_INSTALL_PREFIX /usr/local)
     
    # au fil du temps, tu voudras sans doute fournir d'autres modules à CMake
    # personnelement, je les places dans un dossier spécifique nommé cmake
    # qui se trouve dans le dossier racine, la ligne suivante définit le
    # dossier en question
    set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
     
    # force l'utilisation des versions statiques de la SFML
    set(SFML_STATIC_LIBRARIES ON)
     
    # recherche les différents composants de la SFML
    # Le terme REQUIRED indique que la configurtion doit
    # échouer si l'un des composants n'est pas présentjoute les fichiers d'en-tête au projet
     
    find_package(SFML COMPONENTS network audio graphics window system REQUIRED)
     
    # par facilité, je vais créer une liste reprenant les fichiers d'en-tête
    # et une autre liste reprenant les fichiers d'implémentation
    # A chaque fois que tu rajoute un fichier à ton projet, il "suffit" de le 
    # rajouter à la ligne correspondante
    set(HEADERS )
    set(SRCS main.cpp)
     
    # définit lenom de la cible comme étant le nom du projet
    set(TGT_NAME ${PROJECT_NAME})
     
    # crée un exécutable dont le nom sera le nom de la cible
    add_executable(${TGT_NAME} # utilise le nom du projet comme non d'exécutable
                   ${SRCS} # ajoute les fichiers d'implémentaiton au projet
                   ${HEADERS} )
     
    target_link_libraries(${TGT_NAME} sfml-graphics sfml-system)

    et d'un fichier d'implémantation (main.cpp "classique) ressemblant à
    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
    #include <SFML/Graphics.hpp> 
    int main(){
        sf::RenderWindow window(sf::VideoMode(800, 600), "SFML OpenGL"); 
        while(window.isOpen()){ 
            sf::Event event; 
            while (window.pollEvent(event)) { 
                // Window closed or escape key pressed: exit 
                if ((event.type == sf::Event::Closed) || 
                    ((event.type == sf::Event::KeyPressed) && 
                    (event.key.code == sf::Keyboard::Escape))) { 
    					window.close(); break; 
                } 
            } 
            // Clear the whole window before rendering a new frame window.clear(); 
            // End the current frame and display its contents on screen 
            window.display();
        } 
        return EXIT_SUCCESS;
    }

    Pour utiliser CMake, on conseille généralement d'effectuer la compilation dans un dossier séparé, par exemple, en utilisant une arborescence proche de
    Code Bash :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <dossier_racine>
    |-> build    #dossier de compilation
    |-> cmake #où les modules perso de CMake viendront
    |-> CMakeLists.txt
    |->main.cpp
    (je continue avec le même exemple, on peut faire des choses bien plus compliquées )
    En se plaçant dans le dossier build, il suffit de lancer la commande
    Code Bash :Sélectionner tout -Visualiser dans une fenêtre à part
    cmake ..

    pour que CMake fasse son oeuvre. Par la suite, une simple commande
    Code Bash :Sélectionner tout -Visualiser dans une fenêtre à part
    make
    ou
    Code Bash :Sélectionner tout -Visualiser dans une fenêtre à part
    cmake --build .
    aura pour effet de lancer la compilation

    Note que j'ai fait "au plus simple" pour l'exemple, mais que CMake peut parfaitement gérer plusieurs projets en même temps, et même générer les fichiers requis par différents systèmes et/ou EDI, parmi lesquels on compte
    • les Makefiles Unix (ceux générés par défaut avec mon explication)
    • l'utilisation de ninja
    • Watcom WMake
    • CodeBlocs avec différents systèmes de build
    • codelite, avec différents systèmes de uild
    • Sublime Text avec différents systèmes de build
    • Kate
    • Ecllipse CDT
    • Visual Studio
    et qu'il permet aussi d'utiliser différent compilateurs, s'ils sont présents et différents OS en cas de besoin.

    Au final, avec un seul fichier "relativement simple", tu peux littéralement faire en sorte que ton projet puisse être compilé pour n'importe quelle cible
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  16. #16
    Futur Membre du Club
    Citation Envoyé par koala01 Voir le message
    Salut,

    Il faut déjà faire attention à l'ordre dans lequel tu fournis les bibliothèques SFML à lier, surtout si tu utilise la version partagée (dll / so)

    Personnellement, j'ai eu pas mal de problèmes sous debian à cause de cela. Au point que j'ai décidé d'utiliser la version statique de la SFML (que j'ai du compiler et installer à la main), ce qui m'amène au point suivant

    .. .. .
    Bonjour et merci d'avoir pris le temps pour tout ces détails

    Pour commencer tu as parlé de l'ordre dans lequel on fourni les bibliothèques SFML à lier, d'après se que je sais, cela se fait dans l'édition des liens, du cou, j'ajoute ' -I/usr/local/include -L/usr/local/lib -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio ' en fin de ligne avant les FLAGS comme indiqué plus haut.

    En ce qui concerne CMake, tu as bien raison cela facilite les choses, je l'ai déjà utilisé pour certains projets en C, cependant, avant d'automatiser les choses, je préfère d'abord le faire fonctionnement manuellement, parce que si j'arrive pas a comprendre mon projet, alors cela ne sert à rien non ? Mais j'en prend note de l'exemple et j'essayerai de le tester pour voir ce que sa donne, pour cela il faut utiliser la lib static n'est ce pas ?

    Merci encore ^^

  17. #17
    Expert éminent sénior
    Citation Envoyé par CaptainEd Voir le message

    En ce qui concerne CMake, tu as bien raison cela facilite les choses, je l'ai déjà utilisé pour certains projets en C, cependant, avant d'automatiser les choses, je préfère d'abord le faire fonctionnement manuellement, parce que si j'arrive pas a comprendre mon projet, alors cela ne sert à rien non ?
    As tu vraiment besoin de savoir comment fonctionne ta foreuse pour percer un trou
    Du moment que tu sais où tu dois mettre la mèche, que faire de ces deux petites pointes métaliques qui sortent à la fin du cable et sur quel bouton appuyer pour la faire tourner, n'en sais tu pas assez pour l'utiliser

    Ton makefile correspond à la "mécanique interne" de ta foreuse.

    Tu peux, bien sur, t'amuser à ouvrir ta foreuse, à observer ce qui la compose et essayer de comprendre ce à quoi servent les différents éléments, mais quel en serait l'intérêt (en dehors de ton édification personnelle)

    Tu as la chance de disposer (au travers de CMake) d'un outil qui fera les choses qui doivent être fait exactement au moment où il sera opportun de les faire, et ce qui est encore mieux que tout, sans risque d'erreur (pour autant que tu donne les informations correctes).

    Crois tu que tu comprendra mieux ou moins bien ton projet en t'emm...dant à écrire ton Makefile plutôt qu'en indiquant que "tu veux rechercher les différents composants de la SFML" puis que "tu veux utiliser tel et tel composant de la SFML lors de l'édition de liens"

    Pour être honnête avec toi, j'en doute très sérieusement.

    Pire encore, je peux te garantir que tu auras beaucoup plus difficile à mettre ton Makefile au point qu'à décrire ton projet pour CMake

    Mais j'en prend note de l'exemple et j'essayerai de le tester pour voir ce que sa donne, pour cela il faut utiliser la lib static n'est ce pas ?
    Le CMakeLists précise à CMake que je vais utiliser la versoon statique de la SFML (au travers de la ligne set(SFML_STATIC_LIBRARIES ON)).

    Ce n'est pas ** forcément ** une obligation. C'est une décision personnelle que j'ai été mené à prendre dans ma situation particulière de manière à m'assurer que mon exemple était correct et pouvait compiler.

    Tant que tu gardes en tête le fait que je t'ai présenté un exemple et qu'il y a -- par conséquent -- sans doute, d'autres manières de faire ou d'organiser ton projet, voire une foule de possibilités d'adaptations
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  18. #18
    Futur Membre du Club
    Citation Envoyé par koala01 Voir le message
    As tu vraiment besoin de savoir comment fonctionne ta foreuse pour percer un trou
    Du moment que tu sais où tu dois mettre la mèche, que faire de ces deux petites pointes métaliques qui sortent à la fin du cable et sur quel bouton appuyer pour la faire tourner, n'en sais tu pas assez pour l'utiliser

    Ton makefile correspond à la "mécanique interne" de ta foreuse.. .. .
    Salut ^^

    Pour répondre à ta question concernant le fonctionnement de la foreuse, hmmm, je dirais que oui. Il m'arrive souvent d'acheter 2pièces d'un truk juste pour décortiquer un au risque de l'abimer
    Mais là n'est pas la question, s'il y a un problème il faut le résoudre non ? Et c'est le cas, j'ai réussi enfin la compilation sur mac & win sans erreurs ni warning,avec un makefile à la main et un générer avec cmake et sa c'est le top ^^ Maintenant je peux travailler avec le fameux CMakeLists trankilou.

    Je mets à dispo pour ceux qui auront le meme prob un makefile de base :

    Code Makefile :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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    OS=MAC
    FLAGS=-DDEBUG -DPROD -D$(OS) -O3 -g -Wall -Wextra -pedantic -Wno-deprecated -std=c++14 
     
    OBJS=Obj0.o Obj1.o Obj2.o
     
     
    SFTAGS=-lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio -lsfml-network
    ifeq ($(OS),WIN)
    	CC=g++
    	EXT=exe
    	RM=del
    	CMD_CLS=cls
     
    	LIBSFM=-I C:\SFML2_MingW\include -L C:\SFML2_MingW\lib $(SFTAGS)
    	SFWIN_FLAGS=$(LIBSFM)
     
    else
    	CC=clang++
    	EXT=app
    	RM=rm
    	CMD_CLS=clear
     
    	OS_FLAGS=-Wl,-t
     
    	ifeq ($(OS),MAC)
    		LIBSFM=-I/usr/local/include -L/usr/local/lib $(SFTAGS)
    	else
    		LIBSFM=LinuX
    	endif
    endif
     
    EXE=Bibi.$(EXT)
     
     
    $(EXE): main.o $(OBJS)
    	mkdir -p bin
    	$(CC) main.o $(OBJS) -o bin/$(EXE) -lpthread $(LIBSFM) $(FLAGS) $(OS_FLAGS)
     
     
    Obj0.o: Head0.hpp Head1.hpp
    	$(CC) -c Obj0.cpp $(SFWIN_FLAGS) $(FLAGS)
     
    Obj1.o: Head0.hpp Head1.hpp Conf/Head1.hpp
    	$(CC) -c Conf/Obj1.cpp $(SFWIN_FLAGS) $(FLAGS)
     
    Obj2.o: Head0.hpp Head1.hpp
    	$(CC) -c Obj2.cpp $(SFWIN_FLAGS) $(FLAGS)
     
     
    main.o: Head0.hpp Head1.hpp
    	$(CC) -c main.cpp $(SFWIN_FLAGS) $(FLAGS)
     
    clean:
    	@echo clean
    	$(RM) -f *.o *~ *.stackdump


    Et le CMakeLists.txt :
    Code CMakeLists :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
    47
    set(MAC ON)
    # set(WIN ON)
     
    if(MAC)
      set(EXT .app)
      set(VERS 3.17)
     
    elseif(WIN)
      set(VERS 3.11)
    endif()
     
    cmake_minimum_required(VERSION ${VERS})
     
     
    # définit le standard utilisé pour C++
    set(CMAKE_CXX_STANDARD 14)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    set(CMAKE_CXX_EXTENSIONS OFF)
     
     
    project(Bibi${EXT})
     
     
    # défini le préfixe d'installation du programme créé
    # set(CMAKE_INSTALL_PREFIX /usr/local)
     
     
    # recherche les différents composants de la SFML
    find_package(SFML COMPONENTS network audio graphics window system REQUIRED)
     
     
    # fichiers d'en-tête | fichiers d'implémentation
    set(HEADERS Head0.hpp Head1.hpp Conf/Head2.hpp)
    set(SRCS main.cpp Src0.cpp Src1.cpp Conf/Sr2.cpp)
     
     
    # définit le nom de la cible comme étant le nom du projet
    set(EXE ${PROJECT_NAME})
     
    # crée un exécutable dont le nom sera le nom de la cible
    add_executable(
    	${EXE}
    	${SRCS}
    	${HEADERS}
    )
     
    target_link_libraries(${EXE} sfml-graphics sfml-window sfml-system sfml-audio sfml-network)


    Merci à vous tous pour votre aide & vos conseils
    A une prochaine & à vos programmes

  19. #19
    Expert éminent sénior
    Citation Envoyé par CaptainEd Voir le message
    Pour répondre à ta question concernant le fonctionnement de la foreuse, hmmm, je dirais que oui. Il m'arrive souvent d'acheter 2pièces d'un truk juste pour décortiquer un au risque de l'abimer
    Comme tu dis si bien "au risque de l'abîmer" ...

    Personnellement, je dois t'avouer que, depuis plus de quinze ans que je m'intéresse à l'informatique et que je travaille dans le domaine (incluant les cours que j'ai suivi), je n'ai JAMAIS écrit un makefile (autre que contenant les règles de base)à la main.

    C'est peut-être ma faute, car, au début, j'utilisais des IDE sous windows et les autotools sous linux

    Maintenant, j'espère qu'il t'aura au moins appris quelque chose, mais, très sincèrement, j'en doute

    En tout état de cause, je doute qu'il t'ai appris quoi que ce soit de réutilisable sur l'organisation d'un projet, surtout que tu vas -- à termes -- partir sur des projets beaucoup plus complexes dont l'organisation pourrait ressembler à quelque chose de "classique" comme
    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
    <root_dir>
    |-> apps     // on peut avoir plusieur applications
    |    |->client
    |    |    |-> main.cpp
    |    |->server
    |    |    |->main.cpp
    |->docs    //les fichiers nécessaire à la génération automatique de documentation
    |    |-> ...
    |->lib    //on a souvent besoin de créer plusieurs bibliothèques (modules
    |    |-> business     // les fonctionnalités "bunisness"
    |    |    |->include // les fichiers d'en-tête
    |    |   |->src     // les fichiers d'implémentation
    |    |->module_1
    |    |    |->include   //DITO
    |    |    |->src    //DITO
    |    |-> ... // tous les autres modules
    |-> tests 
    |    |->business  // les tests spécifiques au fonctionnalités business
    |    |    |-> ...    // les fichiers relatifs au test "business"
    |    |->module_1
    |    |    |->...    // DITO
    |    -> ...    //autres modules
    |-> ...  // d'autre dossiers de premier niveau peuvent exister ...

    Où chaque dossier présente des spécificités et des dépendances (internes et / ou externes) spécifiques et pour lesquels la simple idée de vouloir les gérer avec des Makefile "faits main et roulés sous les aisselles" est une pure hérésie
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog