Forum de la communauté SFML

Aide => Général => Discussion démarrée par: bokoblin le Juillet 19, 2016, 08:07:05 pm

Titre: Problème d'ajout SFML comme bibliothèque externe sur CLion
Posté par: bokoblin le Juillet 19, 2016, 08:07:05 pm
Bonjour, j'essaye depuis hier d'ajouter la SFML sur CLion à un projet importé (qui fonctionnait avec Code::Blocks), mais je ne connais pas bien le fonctionnement du CMakeLists.txt. J'ai donc essayé en me basant sur des sujets similaires mais j'obtiens les erreurs suivantes :

"C:\Program Files (x86)\JetBrains\CLion 2016.1.3\bin\cmake\bin\cmake.exe" --build C:\Users\Arthur\.CLion2016.1\system\cmake\generated\runner-f97632df\f97632df\Debug --target all -- -j 4
[  3%] Linking CXX executable runner.exe
CMakeFiles\runner.dir/objects.a(AnimatedGraphicElement.cpp.obj): In function `AnimatedGraphicElement::AnimatedGraphicElement(sf::Texture&, float, float, float, float, std::vector<sf::Rect<int>, std::allocator<sf::Rect<int> > > const&)':
D:/Arthur/Documents/IUT/Prog Objet/Projet/POO-Runner/runner/Sources/AnimatedGraphicElement.cpp:15: undefined reference to `__imp__ZN2sf6Sprite14setTextureRectERKNS_4RectIiEE'
CMakeFiles\runner.dir/objects.a(AnimatedGraphicElement.cpp.obj): In function `AnimatedGraphicElement::AnimatedGraphicElement(AnimatedGraphicElement const&)':
D:/Arthur/Documents/IUT/Prog Objet/Projet/POO-Runner/runner/Sources/AnimatedGraphicElement.cpp:28: undefined reference to `__imp__ZN2sf6Sprite14setTextureRectERKNS_4RectIiEE'
CMakeFiles\runner.dir/objects.a(AnimatedGraphicElement.cpp.obj): In function `AnimatedGraphicElement::sync()':
D:/Arthur/Documents/IUT/Prog Objet/Projet/POO-Runner/runner/Sources/AnimatedGraphicElement.cpp:67: undefined reference to `__imp__ZN2sf6Sprite14setTextureRectERKNS_4RectIiEE'
CMakeFiles\runner.dir/objects.a(AnimatedGraphicElement.cpp.obj):AnimatedGraphicElement.cpp:(.rdata$_ZTV22AnimatedGraphicElement[_ZTV22AnimatedGraphicElement]+0x20): undefined reference to `sf::Sprite::draw(sf::RenderTarget&, sf::RenderStates) const'
CMakeFiles\runner.dir/objects.a(Button.cpp.obj): In function `Button::Button(std::vector<sf::Rect<int>, std::allocator<sf::Rect<int> > > const&, sf::Texture&, float, float, float, float, bool)':
D:/Arthur/Documents/IUT/Prog Objet/Projet/POO-Runner/runner/Sources/Button.cpp:14: undefined reference to `__imp__ZN2sf6Sprite14setTextureRectERKNS_4RectIiEE'

(...)

D:/Arthur/Documents/IUT/Prog Objet/Projet/POO-Runner/runner/Sources/Text.cpp:665: undefined reference to `__imp__ZN2sf12RenderTarget4drawERKNS_8DrawableERKNS_12RenderStatesE'
collect2.exe: error: ld returned 1 exit status
CMakeFiles\runner.dir\build.make:852: recipe for target 'runner.exe' failed
mingw32-make.exe[2]: *** [runner.exe] Error 1
mingw32-make.exe[1]: *** [CMakeFiles/runner.dir/all] Error 2
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/runner.dir/all' failed
makefile:82: recipe for target 'all' failed
mingw32-make.exe: *** [all] Error 2

==============================================

Voici le contenu de mon CMakeLists.txt :

cmake_minimum_required(VERSION 3.5)
project(runner)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(EXECUTABLE_NAME ${PROJECT_NAME})

set(SFMLDIR "C:/Program Files/SFML-2.3.2")
set(PUGIDIR "${PROJECT_SOURCE_DIR}/Libs/pugixml-1.7/")

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${SFMLDIR}/cmake/Modules/")
set(SFML_LIBRARIES "${SFMLDIR}/lib")
set(SFML_INCLUDE_DIR "${SFMLDIR}/include")

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PUGIDIR}/cmake/Modules/")
set(PUGI_LIBRARIES "${PUGIDIR}/src")
set(PUGI_INCLUDE_DIR "${PUGIDIR}/src")

set(SOURCE_FILES
    Sources/AnimatedGraphicElement.cpp
    Sources/AnimatedGraphicElement.h
    Sources/Bonus.cpp
    Sources/Bonus.h
(...)
    Sources/Text.cpp
    Sources/Text.h
    Sources/View.cpp
    Sources/View.h)

add_executable(runner ${SOURCE_FILES})

find_package(PUGI)
find_package(SFML 2 COMPONENTS system window graphics network audio)

include_directories("${PUGIDIR}/src" ${SFML_INCLUDE_DIR})
target_link_libraries(${EXECUTABLE_NAME} "${PUGIDIR}/src" ${SFML_LIBRARIES})

====================================

Note : J'essaye aussi de linker la bibliothèque PugiXml avec les mêmes erreurs

Merci d'avance
Titre: Re : Problème d'ajout SFML comme bibliothèque externe sur CLion
Posté par: Cpl.Bator le Juillet 19, 2016, 11:35:36 pm
je suis pas un "pro" du cmake, j'utilise toujours :

cmake_minimum_required(VERSION 2.6)
set(PROJECT_NAME CeQueTuVeut)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

#Configuration du projet
project(${PROJECT_NAME})


#Includes
include_directories(include)

set(SFML_DEPENDENCIES   -lsfml-window
                                                -lsfml-graphics
                                                -lsfml-audio
                                                -lsfml-network
                                                -lsfml-system                                                                                  
                                                )

#Configuration de l'exécutable
file(
        GLOB_RECURSE
        source_files
        src/*
)


add_executable(
        ${PROJECT_NAME}
        ${source_files}
)

target_link_libraries(
        ${PROJECT_NAME}
        ${SFML_DEPENDENCIES}
        )
 

& ca marche pour une dépendance dynamique avec c++11 activé avec g++ ou mingw sous windows.
avec une structure de projet simple :

- Root
--include
--src
--build
-CMakeLists.txt
Titre: Re : Problème d'ajout SFML comme bibliothèque externe sur CLion
Posté par: Laurent le Juillet 20, 2016, 07:55:37 am
Citer
set(SFML_LIBRARIES "${SFMLDIR}/lib")
set(SFML_INCLUDE_DIR "${SFMLDIR}/include")
Je ne sais pas si cela a un rapport avec ton problème, mais en tout cas cela ne sert à rien puisque ces variables vont être définies automatiquement par l'appel à find_package(SFML ...). Que contient la variable SFML_LIBRARIES après configuration ? Est-ce que c'est correct ou pas ?

Citer
set(SFML_DEPENDENCIES   -lsfml-window
                        -lsfml-graphics
                        -lsfml-audio
                        -lsfml-network
                        -lsfml-system                                          
                        )
Cela suppose tout un tas de choses. Il faut utiliser find_package(SFML ...) pour être vraiment générique.
Titre: Re : Problème d'ajout SFML comme bibliothèque externe sur CLion
Posté par: Cpl.Bator le Juillet 20, 2016, 01:47:31 pm
Citer
Cela suppose tout un tas de choses
cela suppose entre autre que la sfml est installé (pour windows ) dans les dossiers du compilateur ( include & lib & bin ) , sous linux, pas de soucis. c'est automatique.
je ne veut pas de la SFML dans des dossiers comme "program files", d'ou la non utilisation du module. :)
Titre: Re : Problème d'ajout SFML comme bibliothèque externe sur CLion
Posté par: Laurent le Juillet 20, 2016, 07:25:25 pm
Citer
cela suppose entre autre que la sfml est installé (pour windows ) dans les dossiers du compilateur ( include & lib & bin ) , sous linux, pas de soucis. c'est automatique.
Non. Beaucoup de gens compilent et installent leurs bibliothèques dans leur home. Il se peut aussi que certains chemins d'installation "standard" pour le système ne le soient pas pour le compilateur et l'éditeur de liens.

Cela suppose aussi que tu utilises la variante release/shared de SFML.
Titre: Re : Re : Problème d'ajout SFML comme bibliothèque externe sur CLion
Posté par: bokoblin le Juillet 20, 2016, 09:34:35 pm

Citer
set(SFML_LIBRARIES "${SFMLDIR}/lib")
set(SFML_INCLUDE_DIR "${SFMLDIR}/include")
Je ne sais pas si cela a un rapport avec ton problème, mais en tout cas cela ne sert à rien puisque ces variables vont être définies automatiquement par l'appel à find_package(SFML ...). Que contient la variable SFML_LIBRARIES après configuration ? Est-ce que c'est correct ou pas ?
Je ne savais pas si c'était utile ou non c'est pour ça que je les ai laissé mais je vais les enlever si ils ne servent à rien.
Titre: Re : Problème d'ajout SFML comme bibliothèque externe sur CLion
Posté par: Laurent le Juillet 20, 2016, 10:03:53 pm
Citation de: Laurent
Que contient la variable SFML_LIBRARIES après configuration ? Est-ce que c'est correct ou pas ?
Titre: Re : Problème d'ajout SFML comme bibliothèque externe sur CLion
Posté par: bokoblin le Juillet 20, 2016, 10:08:48 pm
Comment je peux faire ?

Edit: J'ai trouvé. Cela donne :

-- SFML_LIBRARIES=C:/Program Files/SFML-2.3.2/lib;

Mais cela ne marche pas j'ai pu afficher aussi :

-- SFML_CONFIG_HPP_INPUT=C:/Program Files/SFML-2.3.2/include/SFML/Config.hpp
-- SFML_FOUND=FALSE
-- SFML_GRAPHICS_FOUND=FALSE
-- SFML_GRAPHICS_LIBRARY=
-- SFML_GRAPHICS_LIBRARY=
-- SFML_GRAPHICS_LIBRARY_DEBUG=
Titre: Re : Problème d'ajout SFML comme bibliothèque externe sur CLion
Posté par: Laurent le Juillet 20, 2016, 10:55:32 pm
Ajoute l'argument REQUIRED à find_package(SFML ...). Ca provoquera une erreur fatale si SFML n'est pas trouvée -- ce qui semble être le cas ici.

Si SFML n'est pas installée dans un endroit standard, il faut aider un peu CMake en définissant la variable SFML_ROOT.
Titre: Re : Re : Problème d'ajout SFML comme bibliothèque externe sur CLion
Posté par: bokoblin le Juillet 20, 2016, 11:03:53 pm
Ajoute l'argument REQUIRED à find_package(SFML ...). Ca provoquera une erreur fatale si SFML n'est pas trouvée -- ce qui semble être le cas ici.

Si SFML n'est pas installée dans un endroit standard, il faut aider un peu CMake en définissant la variable SFML_ROOT.

============================

Ca marche avec SFML_ROOT , j'ai plus que des messages liés à PugiXml, je dois donc faire de même.
Merci



Revoici le cmakelists.txt au cas où :

cmake_minimum_required(VERSION 3.5)

#Configuration du projet
set(PROJECT_NAME runner)
project(${PROJECT_NAME})
set(EXECUTABLE_NAME ${PROJECT_NAME})

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

#include_directories("${PROJECT_SOURCE_DIR}/Libs")

set(SFMLDIR "C:/Program Files/SFML-2.3.2")
set(SFML_ROOT "C:/Program Files/SFML-2.3.2")

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${SFMLDIR}/cmake/Modules/")
set(SFML_LIBRARIES "${SFMLDIR}/lib")
set(SFML_INCLUDE_DIR "${SFMLDIR}/include")

set(SOURCE_FILES
    Sources/AnimatedGraphicElement.cpp
    Sources/AnimatedGraphicElement.h

(...)

    Sources/View.cpp
    Sources/View.h
        )

add_executable(runner ${SOURCE_FILES})

#find_package(PUGI)
find_package(SFML 2 COMPONENTS system window graphics audio REQUIRED)

include_directories( ${SFML_INCLUDE_DIR} )

target_link_libraries(${EXECUTABLE_NAME} ${SFML_LIBRARIES})
Titre: Re : Problème d'ajout SFML comme bibliothèque externe sur CLion
Posté par: Laurent le Juillet 21, 2016, 08:30:21 am
Citer
set(SFMLDIR "C:/Program Files/SFML-2.3.2")
Ca c'est inutile.

Citer
set(SFML_ROOT "C:/Program Files/SFML-2.3.2")
Ca on évite généralement de le mettre dans le fichier CMakeLists.txt, on le garde pour les variables "dynamiques" (comme ça ton projet peut être utilisé ailleurs que sur ton propre PC).
Titre: Re : Re : Problème d'ajout SFML comme bibliothèque externe sur CLion
Posté par: bokoblin le Juillet 21, 2016, 08:00:13 pm
Citer
set(SFMLDIR "C:/Program Files/SFML-2.3.2")
Ca c'est inutile.

Citer
set(SFML_ROOT "C:/Program Files/SFML-2.3.2")
Ca on évite généralement de le mettre dans le fichier CMakeLists.txt, on le garde pour les variables "dynamiques" (comme ça ton projet peut être utilisé ailleurs que sur ton propre PC).

Ok j'ai rectifié CMakeList, merci.
Edit: C'est bon Build success, après ça plante au démarrage, impossible de débugger, ça plante avant la première ligne du main.cpp :/
Titre: Re: Problème d'ajout SFML comme bibliothèque externe sur CLion
Posté par: tleger1958 le Juin 27, 2017, 04:25:43 pm
Si ça bug toujours, va voir ici : https://oxymeos.shost.ca/article.php?a_propos=travailler_avec_la_SFML_dans_CLion

Ça a marché pour moi.