Partage
  • Partager sur Facebook
  • Partager sur Twitter

Compiler SFML sur Linux(Debian) pour Windows

    31 juillet 2020 à 11:08:45

    Bonjour,

    je code une application SFML sur Linux et j'ai installé mingw pour la compiler en .exe.

    Sur un programme normal, ça fonctionne mais dès que j'essaie de compiler avec la SFML, il n'arrive pas  à trouver les fichier hpp :

    Game/../config.h:1:27: fatal error: SFML/Window.hpp: Aucun fichier ou dossier de ce type
     #include <SFML/Window.hpp>
    

    Voici ma ligne de compil :

    86_64-w64-mingw32-g++ -std=c++17 -isystem thirdparty -Wall -Wno-psabi -o "../app.exe" -lsfml-graphics -lsfml-window -lsfml-system main.cpp (et le reste de mes fichier .cpp)
    

    Merci




    • Partager sur Facebook
    • Partager sur Twitter
      31 juillet 2020 à 17:22:56

      Salut

      Avant toute chose, un truc auquel il faut -- clairement -- faire attention (au cas ce serait passé au bleu :D ): tu ne pourra pas compiler ton application en effectuant l'édition de liens avec la version "debian" de la SFML: il faut donc que tu dispose d'une version "MinGW" (adaptée à la version de MinGW que tu utilies) de SFML.

      La deuxième chose à savoir, c'est que l'option -l<bibliothèque à utiliser> ne fait  qu'indiquer à l'éditeur de liens qu'il doit aller voir du coté de la bibliothèque indiquée s'il n'y trouve pas le code binaire exécutable de l'une ou de l'autre fonctions qui sont appelées par le programme.

       Pour indiquer au compilateur qu'il doit aller chercher dans un dossier bien particulier dans l'espoir d'y trouver des fichiers d'en-têtes utilisés, il faut ajouter l'option -I<dossier à utiliser>.

      Si bien que la ligne de commande pour compiler ton programme devrait prendre la forme finale de 86_64-w64-mingw32-g++ -std=c++17 -isystem thirdparty -Wall -Wno-psabi -o "../app.exe" -I<dossier ou trouver fichiers d'en-tête SFML>  -lsfml-graphics -lsfml-window -lsfml-system main.cpp .

      Notes enfin que, si tu  as compilé la SFML pour qu'elle puisse servir avec MinGW, tu disposes sans doute de CMake (que je te conseille de toutes manières d'installer si tu ne l'utilises pas encore), et que tu pourrais "très facilement" laisser CMake gérer tout cela pour toi lors de la configuration du compilateur que tu utilises ;)

      • Partager sur Facebook
      • Partager sur Twitter
      Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
        1 août 2020 à 11:09:25

        Avec mingw et la commande -I, il me trouve mes fichier sfml mais il ne me trouve pas un fichier <gnu/stubs.h>;

        avec CMake je n'arrive pas à linker ma bibliotheque :

        pi@raspberrypi:~/Documents/Prog/Projet $ cmake . -G"Unix Makefiles"CMake Error at CMakeLists.txt:13 (include):
          include could not find load file:
        
            FindSFML
        
        
        CMake Error at CMakeLists.txt:15 (find_package):
          By not providing "FindSFML.cmake" in CMAKE_MODULE_PATH this project has
          asked CMake to find a package configuration file provided by "SFML", but
          CMake did not find one.
        
          Could not find a package configuration file provided by "SFML" (requested
          version 2.4) with any of the following names:
        
            SFMLConfig.cmake
            sfml-config.cmake
        
          Add the installation prefix of "SFML" to CMAKE_PREFIX_PATH or set
          "SFML_DIR" to a directory containing one of the above files.  If "SFML"
          provides a separate development package or SDK, be sure it has been
          installed.
        
        
        -- Configuring incomplete, errors occurred!
        

        Mon fichier CMakeLists.xtt :

        cmake_minimum_required(VERSION 2.6)
        
                        
        
        #Configuration du projet
        
        project(Projet)
        
        set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})
        
        #Inclusion de la SFML
        
        include(FindSFML)
        
        find_package(
        
                SFML
        
                2.4
        
                REQUIRED sfml-window sfml-graphics sfml-system
        
        )
        
        link_directories(${SFML_LIBRARY_DIRS})
        
        include_directories(${SFML_INCLUDE_DIRS})
        
        #Configuration de l'exécutable
        
        file(
        
                GLOB_RECURSE
        
                source_files
        
                Code/*
        
        )
        
        add_executable(
        
                my_exe
        
                ${source_files}
        
        )
        
        #Configuration de l'édition de liens
        
        target_link_libraries(
        
                my_exe
        
                ${sfml_lib_name}
        
        )






        -
        Edité par Rayquaza Delta 1 août 2020 à 11:10:12

        • Partager sur Facebook
        • Partager sur Twitter
          1 août 2020 à 13:24:42

          La commande include(FindSFML) est inutile. Pour réussir, find_package(Lib) doit trouver un fichier findLib.cmake, ou un fichier Lib-Config.cmake (sans tiret eventuellement ou en minuscule). Le dernier type de fichier est la methode moderne, où les librairies créent elles mêmes ces fichiers pour les projets avals. On peut d'ailleurs specifier CONFIG dans find_package pour qu'il cherche directement le fichier config sans tenter de trouver un fichier findLib potentiellement moisi.

          Le fichier config est créé lorsque tu installes SFML via CMake (si SFML exportes correctement ses target, je sais pas vu que j'utilise pas cette lib). La variable CMAKE_PREFIX_PATH permet d'indiquer où se trouve ce fichier.

          -
          Edité par SpaceIn 1 août 2020 à 13:31:45

          • Partager sur Facebook
          • Partager sur Twitter
            1 août 2020 à 19:37:55

            J'ai bien un fichier FindSFML.cmake à l'emplacement "/usr/share/SFML/cmake/Modules", mais je crois qu'il ne me le trouve pas.

            Pour l'installation de la SFML, j'ai suivi leur tuto sur leur site, mais je n'ai pas de fichier config.

            • Partager sur Facebook
            • Partager sur Twitter
              1 août 2020 à 21:21:56

              En fait SFML a remplacé le fichier FindSFML (ce genre de fichier peut être moins robuste qu'un fichier config) par un fichier config à partir de la 2.5.0: https://github.com/SFML/SFML/blob/3f4bc3683b804155aaa04a8422a9ad6c1fb5b14d/changelog.md#general-1

              Tu peux renseigner le chemin de ton fichier FindSFML.cmake dans la variable CMAKE_MODULE_PATH.

              -
              Edité par SpaceIn 1 août 2020 à 21:32:29

              • Partager sur Facebook
              • Partager sur Twitter
                2 août 2020 à 11:30:56

                La commande 
                cmake . -G"Unix Makefiles"


                marche, mais make ne me trouve pas une autre bibliotheque tierce qui se trouve ds mon dossier thirdpatry qui est ds le dossier de mon projet.

                Comment je dois le linker ? ?

                -
                Edité par Rayquaza Delta 2 août 2020 à 11:43:16

                • Partager sur Facebook
                • Partager sur Twitter
                  2 août 2020 à 12:22:50

                  Il y a quoi dans ce dossier thirdparty? Le code source de ta dépendance? La librairie déjà installée (avec des dossiers bin, include, lib)? Quelle est cette librairie?

                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 août 2020 à 12:42:49

                    Il y a la bibliotheque nlohmann que j'utilise pour traiter du json. Je l'ai téléchargé via github et je l'ai mis ds mon dossier. Il ne contient que des .hpp.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 août 2020 à 13:17:12

                      Il y a plusieurs manières de faire.

                      Si tu as effectivement un clone de https://github.com/nlohmann/json encapsulé dans ton projet (si tu utilises git, fais en un submodule), le plus simple pour toi est d'utiliser add_subdirectory, puis de linker la target nlohmann_json::nlohmann_json


                      Quelque chose dans ce genre:

                      cmake_minimum_required(VERSION 3.1)
                      project(myproject VERSION 1.0.0)
                      
                      add_subdirectory(thirdparty/nlohmann_json)
                      
                      add_executable(myapp main.cpp)
                      target_link_libraries(myapp nlohmann_json::nlohmann_json)
                      



                      -
                      Edité par SpaceIn 2 août 2020 à 13:18:56

                      • Partager sur Facebook
                      • Partager sur Twitter
                        2 août 2020 à 20:03:12

                        J'ai déplacé le dossier nlohmann dans /usr/include et maintenant, il a réussi à créer les .o mais à la fin il me renvoit ça :

                        pi@raspberrypi:~/Documents/Prog/Projet $ make
                        [  5%] Linking CXX executable bin/Release/my_exe
                        /usr/bin/ld : ne peut trouver -lnlohmann
                        collect2: error: ld returned 1 exit status
                        CMakeFiles/my_exe.dir/build.make:562 : la recette pour la cible « bin/Release/my_exe » a échouée
                        make[2]: *** [bin/Release/my_exe] Erreur 1
                        CMakeFiles/Makefile2:67 : la recette pour la cible « CMakeFiles/my_exe.dir/all » a échouée
                        make[1]: *** [CMakeFiles/my_exe.dir/all] Erreur 2
                        Makefile:83 : la recette pour la cible « all » a échouée
                        make: *** [all] Erreur 2

                        Mon fichhier CMakeLists.txt :

                        cmake_minimum_required(VERSION 3.1)
                        
                                        
                        
                        #Configuration du projet
                        
                        project(Projet VERSION 1.0.0)
                        
                        set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})
                        
                        #Inclusion de la SFML
                        
                        find_package(
                        
                                SFML
                        
                                2.4
                        )
                        
                        link_directories(${SFML_LIBRARY_DIRS})
                        
                        include_directories(${SFML_INCLUDE_DIRS})
                        
                        # nlohmann
                        
                        include_directories(/usr/include)
                        
                        link_directories(/usr/include/nlohmann)
                        
                        #Configuration de l'exécutable
                        
                        file(
                        
                                GLOB_RECURSE
                        
                                source_files
                        
                                Code/*
                        
                        )
                        
                        add_executable(
                        
                                my_exe
                        
                                ${source_files}
                        
                        )
                        
                        #Configuration de l'édition de liens
                        
                        target_link_libraries(
                        
                                my_exe
                        
                                ${sfml_lib_name}
                                
                                nlohmann
                                
                        )
                        




                        -
                        Edité par Rayquaza Delta 4 août 2020 à 13:51:03

                        • Partager sur Facebook
                        • Partager sur Twitter
                          5 août 2020 à 20:00:39

                          Qu'est-que c'est -lnlohmann ? Un dossier de libs, un fichier ou autre chose ?

                          Et je pourrais pas marquer ${nlohmann_lib_name} à la ligne 58 ?

                          -
                          Edité par Rayquaza Delta 5 août 2020 à 20:02:13

                          • Partager sur Facebook
                          • Partager sur Twitter
                            5 août 2020 à 21:09:09

                            C'est du vieux CMake tout ça, alors que tu utilises CMake 3.x.x...

                            - Link les targets (qui sont des noms abstraits, potentiellement rien à voir avec un quelconque nom de repertoire ou le nom de fichier de la lib), c'est beaucoup plus robuste que d'ajouter les repertoires d'include, des libs, les flags de compilation à la main.

                            - n'ajoute pas des choses globalement, toutes les fonctions du type include_directories etc sont à bannir en CMake moderne, utilise target_include_directories etc à la place.

                            - nlohmann_json est header_only, il n y a rien à linker du tout, seulement à ajouter le repertoire avec target_include_directories. Ou mieux comme j'ai dit precedemment en incluant complement le projet nlohmann_json (pas juste les headers, tout le projet git, surtout son CMakeLists.txr, et en respectant l'arbo des headers publics), et en utilisant la target nlohmann_json::nlohmann_json. L'inclusion officielle de cette librairie très populaire est #include <nlohmann/json.hpp>. Donc si tu fais des trucs à la main, fais en sorte d'ajouter le repertoire qui contient le sous repertoire nlohmann.

                            Bon j'arrete là, l'ecriture de reponse longue avec un smartphone est un calvaire sur oc :/

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Compiler SFML sur Linux(Debian) pour Windows

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            • Editeur
                            • Markdown