Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Linux : SFML et Codeblocks  (Lu 4143 fois)

0 Membres et 1 Invité sur ce sujet

adralith

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Linux : SFML et Codeblocks
« le: Février 19, 2016, 01:24:34 pm »
Bonjour,
Je suis étudiant en informatique et un de mes projets consiste à créer un jeu vidéo en 2D.
Devant utiliser SFML, j'ai choisi codeblocks (choix peut-être discutable).
J'ai un problème lors de la configuration du logiciel, j'ai pourtant suivi le tutoriel à la lettre, je vais vous donnez un aperçu de ce qui ne va pas et qui ne fonctionne pas très bien.
(Je possède un niveau Débutant+, je ne comprends pas exactement TOUT...)

Voici ce que j'ai indiqué dans projet-> build options -> linker settings -> link libraries : (Sous Release).
../../SFML-2.3.2/lib/sfml-graphics
../../SFML-2.3.2/lib/sfml-window
../../SFML-2.3.2/lib/sfml-system

(C'est le chemin relatif de ces fichiers, ce que je n'ai pas compris c'est que les fichiers possèdent l'extension ".so" et que dans le tutoriel il est indiqué de retirer l'extension ".a" et le préfixe "lib"...)

Maintenant dans search directories -> compiler (Pour le projet)
../../SFML-2.3.2/include
(Chemin relatif nécessaire)

et dans search directories -> linker :
../../SFML-2.3.2/lib
(Chemin relatif nécessaire).


A la place du :
#include <Graphics.hpp>
j'ai mis :
#include <../../SFML-2.3.2/include/SFML/Graphics.hpp>
(Chemin relatif jusqu'au fichier, j'ai essayé les deux versions !)
Et voici maintenant la liste des erreurs qui sont elles, des "undefined references" :

obj/Debug/main.o||In function `main':|
/home/nouvalinux/Bureau/jeu/sfml-app/main.cpp|5|undefined reference to `sf::String::String(char const*, std::locale const&)'|
/home/nouvalinux/Bureau/jeu/sfml-app/main.cpp|5|undefined reference to `sf::VideoMode::VideoMode(unsigned int, unsigned int, unsigned int)'|
/home/nouvalinux/Bureau/jeu/sfml-app/main.cpp|5|undefined reference to `sf::RenderWindow::RenderWindow(sf::VideoMode, sf::String const&, unsigned int, sf::ContextSettings const&)'|
/home/nouvalinux/Bureau/jeu/sfml-app/main.cpp|6|undefined reference to `sf::CircleShape::CircleShape(float, unsigned long)'|
/home/nouvalinux/Bureau/jeu/sfml-app/main.cpp|7|undefined reference to `sf::Color::Green'|
/home/nouvalinux/Bureau/jeu/sfml-app/main.cpp|7|undefined reference to `sf::Shape::setFillColor(sf::Color const&)'|
/home/nouvalinux/Bureau/jeu/sfml-app/main.cpp|15|undefined reference to `sf::Window::close()'|
/home/nouvalinux/Bureau/jeu/sfml-app/main.cpp|12|undefined reference to `sf::Window::pollEvent(sf::Event&)'|
/home/nouvalinux/Bureau/jeu/sfml-app/main.cpp|18|undefined reference to `sf::Color::Color(unsigned char, unsigned char, unsigned char, unsigned char)'|
/home/nouvalinux/Bureau/jeu/sfml-app/main.cpp|18|undefined reference to `sf::RenderTarget::clear(sf::Color const&)'|
/home/nouvalinux/Bureau/jeu/sfml-app/main.cpp|19|undefined reference to `sf::RenderStates::Default'|
/home/nouvalinux/Bureau/jeu/sfml-app/main.cpp|19|undefined reference to `sf::RenderTarget::draw(sf::Drawable const&, sf::RenderStates const&)'|
/home/nouvalinux/Bureau/jeu/sfml-app/main.cpp|20|undefined reference to `sf::Window::display()'|
/home/nouvalinux/Bureau/jeu/sfml-app/main.cpp|9|undefined reference to `sf::Window::isOpen() const'|
/home/nouvalinux/Bureau/jeu/sfml-app/main.cpp|23|undefined reference to `sf::RenderWindow::~RenderWindow()'|
/home/nouvalinux/Bureau/jeu/sfml-app/main.cpp|5|undefined reference to `sf::RenderWindow::~RenderWindow()'|
/home/nouvalinux/Bureau/jeu/sfml-app/main.cpp|23|undefined reference to `sf::RenderWindow::~RenderWindow()'|
obj/Debug/main.o||In function `~CircleShape':|
/home/nouvalinux/Bureau/jeu/sfml-app/../../SFML-2.3.2/include/SFML/Graphics/CircleShape.hpp|41|undefined reference to `vtable for sf::CircleShape'|
/home/nouvalinux/Bureau/jeu/sfml-app/../../SFML-2.3.2/include/SFML/Graphics/CircleShape.hpp|41|undefined reference to `vtable for sf::CircleShape'|
/home/nouvalinux/Bureau/jeu/sfml-app/../../SFML-2.3.2/include/SFML/Graphics/CircleShape.hpp|41|undefined reference to `sf::Shape::~Shape()'|
||=== Build finished: 20 errors, 0 warnings ===|


Pardon pour l'illisibilité probable de ces erreurs, et si une réponse m'est apportée, je vous en remercie d'avance. J'ai simplement suivi le tutoriel à l'adresse :

sfml-dev.org/tutorials/2.0/start-cb-fr.php

Je travaille sous LINUX qui est un Ubuntu :
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Nouva Linux Client 12.08"

Merci de votre aide !

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Linux : SFML et Codeblocks
« Réponse #1 le: Février 19, 2016, 01:52:27 pm »
- As tu compilé et installé la SFML toi même ?
- Les chemins relatif, c'est pas bon.
- Pour le moment, il apparaît un problème de linkage ( undef.. ref.. )

Pour linké une lib : libsfml-window.so , le paramètre de linkage deviens -lsfml-window , on retire le préfixe lib & on retire l'extension. idem pour n'importe quel lib.

adralith

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Re : Linux : SFML et Codeblocks
« Réponse #2 le: Février 19, 2016, 02:16:35 pm »
Bonjour, merci de ta réponse !
J'ai mis le dossier SFML dans /home/nouvalinux afin de ne gérer que des chemins absolus (comme conseillé)
J'ai ensuite utilisé les links "-lsfml-window" etc...
mais j'ai une erreur :
ld||cannot find -l-lsfml-graphics|
ld||cannot find -l-lsfml-window|
ld||cannot find -l-lsfml-system|
||=== Build finished: 3 errors, 0 warnings ===|

je retourne donc au "sfml-graphics" simple et l'erreur disparait mais voilà le retour des autres erreurs undefined reference ...

En revanche, je ne vois pas ce que tu veux dire par compiler la SFML moi même, je n'ai qu'un dossier contenant 3 dossiers, lib, share, et include.
Si je dois effectivement la compiler et l'installer, comment je fais pour faire tout ça ?

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Linux : SFML et Codeblocks
« Réponse #3 le: Février 19, 2016, 03:21:07 pm »
Citer
ld||cannot find -l-lsfml-graphics|

le linker ne trouve pas la SFML , tout simplement.
pour la compilé & l'installer , tu télécharges les sources , tu décompresses, tu créer un dossier build dans ton dossier des sources :

Citer
cd /ton/dossier/sfml/
mkdir build && cd build
cmake ..
sudo make -j8 && make install

la sfml est installé, si tu as des "erreurs", c'est un problème de dépendance.

adralith

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Re : Linux : SFML et Codeblocks
« Réponse #4 le: Février 19, 2016, 04:58:25 pm »
J'ai essayé pas mal de choses depuis la dernière réponse, et toujours pas, j'ai bien réalisé tes commandes.
J'ai créé un dossier build je suis allé dans build et j'ai fait la commande "sudo make -j8 && make install" cela me renvoir l'erreur :
"make: *** Pas de cibles spécifiées et aucun makefile n'a été trouvé. Arrêt."
J'ai donc fait des recherches supplémentaires et j'ai testé le terminal, désolé d'en demander beaucoup mais pourrais tu étudier l'erreur dans ce qui suit ? Je t'en remercie d'avance, je vais détailler un maximum !

Etape du début : J'ai téléchargé SFML pour linux 64 bits (mon système est un 64 bits) qui contient "share" / "lib" et "include".
Je le dézippe et place sur mon bureau.
Je décide également de le placer dans /usr/local/lib (pour la lib)
et /usr/local/include (pour le include)
et /usr/local/share (pour le share).
 


1. Je créer un fichier vierge que je nomme main.cpp
2. Je rentre un code dedans, qui est le suivant (Très probablement fonctionnel puisqu'il vient du tutorial SFML) :
Citer
#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
    sf::CircleShape shape(100.f);
    shape.setFillColor(sf::Color::Green);

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(shape);
        window.display();
    }

    return 0;
}

3. Je compile ce fichier dans un terminal grâce à la commande : g++ -c main.cpp

4. j'utilise en suite la commande :"g++ main.o -o sfml-app -lsfml-graphics -lsfml-window -lsfml-system"
qui me renvoie l'erreur :

Citer
main.o: In function `main':
main.cpp:(.text+0xf5): undefined reference to `sf::String::String(char const*, std::locale const&)'
main.cpp:(.text+0x13a): undefined reference to `sf::RenderWindow::RenderWindow(sf::VideoMode, sf::String const&, unsigned int, sf::ContextSettings const&)'
main.cpp:(.text+0x16e): undefined reference to `sf::CircleShape::CircleShape(float, unsigned long)'
main.cpp:(.text+0x182): undefined reference to `sf::Shape::setFillColor(sf::Color const&)'
main.cpp:(.text+0x19d): undefined reference to `sf::Window::close()'
main.cpp:(.text+0x1b3): undefined reference to `sf::Window::pollEvent(sf::Event&)'
main.cpp:(.text+0x1f2): undefined reference to `sf::RenderTarget::clear(sf::Color const&)'
main.cpp:(.text+0x209): undefined reference to `sf::RenderStates::Default'
main.cpp:(.text+0x214): undefined reference to `sf::RenderTarget::draw(sf::Drawable const&, sf::RenderStates const&)'
main.cpp:(.text+0x223): undefined reference to `sf::Window::display()'
main.cpp:(.text+0x232): undefined reference to `sf::Window::isOpen() const'
main.o: In function `sf::CircleShape::~CircleShape()':
main.cpp:(.text._ZN2sf11CircleShapeD2Ev[_ZN2sf11CircleShapeD5Ev]+0x13): undefined reference to `vtable for sf::CircleShape'
main.cpp:(.text._ZN2sf11CircleShapeD2Ev[_ZN2sf11CircleShapeD5Ev]+0x1f): undefined reference to `vtable for sf::CircleShape'
collect2: ld a retourné 1 code d'état d'exécution

5. J'en conclue donc comme ce que tu m'as dit, que les chemins ne sont pas correctement indiqués.
6. Je test donc la commande suivante :
"g++ main.o -o sfml-app -L/usr/local/lib -lsfml-graphics -lsfml-window -lsfml-system"

Encore une erreur mais cette fois différente :
Citer
/usr/bin/ld: warning: libxcb-image.so.0, needed by /usr/local/lib/libsfml-window.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libudev.so.1, needed by /usr/local/lib/libsfml-window.so, not found (try using -rpath or -rpath-link)
/usr/local/lib/libsfml-window.so: undefined reference to `udev_device_get_action@LIBUDEV_183'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_list_entry_get_next@LIBUDEV_183'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_unref@LIBUDEV_183'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_list_entry_get_name@LIBUDEV_183'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_enumerate_unref@LIBUDEV_183'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_monitor_unref@LIBUDEV_183'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_new@LIBUDEV_183'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_monitor_receive_device@LIBUDEV_183'
/usr/local/lib/libsfml-window.so: undefined reference to `xcb_create_pixmap_from_bitmap_data'
/usr/local/lib/libsfml-graphics.so: undefined reference to `std::__throw_out_of_range_fmt(char const*, ...)@GLIBCXX_3.4.20'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_device_get_devnode@LIBUDEV_183'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_monitor_enable_receiving@LIBUDEV_183'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_enumerate_new@LIBUDEV_183'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_monitor_get_fd@LIBUDEV_183'
/usr/local/lib/libsfml-graphics.so: undefined reference to `__cpu_model@GCC_4.8.0'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_device_unref@LIBUDEV_183'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_device_get_property_value@LIBUDEV_183'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_monitor_filter_add_match_subsystem_devtype@LIBUDEV_183'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_enumerate_get_list_entry@LIBUDEV_183'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_enumerate_scan_devices@LIBUDEV_183'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_enumerate_add_match_subsystem@LIBUDEV_183'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_device_get_syspath@LIBUDEV_183'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_device_get_sysattr_value@LIBUDEV_183'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_monitor_new_from_netlink@LIBUDEV_183'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_device_new_from_syspath@LIBUDEV_183'
/usr/local/lib/libsfml-window.so: undefined reference to `udev_device_get_parent_with_subsystem_devtype@LIBUDEV_183'
collect2: ld a retourné 1 code d'état d'exécution

Voilà, je suis en train de craquer, je suis sûr qu'il me manque une bêtise, serait-il possible de savoir ce qui ne va pas ? La version SFML ? Une commande de travers ?
Je remarque de plus que dans le lib de SFML il n'y a pas opengl32 (qui est censé être ici apparemment...)
Y aurait -il un chemin qui ferait en sorte de ne pas avoir à le préciser lors d'une commande dans le terminal ?

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Linux : SFML et Codeblocks
« Réponse #5 le: Février 19, 2016, 05:56:26 pm »
Je réponds depuis mon mobile. donc je vais être court.
- aucun makefile , as tu fait "cmake .." dans le dossier build ?
ta dernière erreur sur libxcb libudev etc indique clairement une dépendance non satisfaite. Le site de Laurent est très bien fait, tu devrais relire la doc qu'il a fait. Il a passer du temps dessus. c'est pas pour rien ;)

La solution est ici:

http://www.sfml-dev.org/tutorials/2.3/compile-with-cmake-fr.php

ne lis pas en diagonal , surtout les dépendances.
« Modifié: Février 19, 2016, 06:06:13 pm par Cpl.Bator »

adralith

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Re : Linux : SFML et Codeblocks
« Réponse #6 le: Février 19, 2016, 06:38:56 pm »
Je te remercie d'avoir pris le temps de me répondre, je suis actuellement en train de mettre à jour Ubuntu (J'étais sur le 12.04, je passe à la dernière, on ne sait jamais ! ) le temps que cela se fasse, je vais étudier ton lien en détail ! Une fois que tout sera compris et installé, je referais un test, je te tiens au courant de la suite du problème, encore merci !

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Linux : SFML et Codeblocks
« Réponse #7 le: Février 19, 2016, 07:15:42 pm »
Le problème est simple :

- installe les dépendances.
- compile la sfml.
- compile ton programme.

Bon code ! :)

adralith

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Re : Linux : SFML et Codeblocks
« Réponse #8 le: Février 20, 2016, 04:58:32 pm »
Bonjour !

Le problème est résolu, j'ai eu pas mal de difficulté puisqu'entre deux j'ai réussi à faire planter mon pc qui possédait Ubuntu, j'ai donc dû graver un ISO d'Ubuntu 14.03 sur un Dvd vierge et réinstaller.
(Il est à mes yeux plus sympathique que les précédents jusqu'à ce que je lui trouve un défaut)

J'ai donc suivi le lien sur les dépendances qui n'indiquait cependant pas comment les installer, je me suis donc rendu sur :

https://openclassrooms.com/courses/creez-des-applications-2d-avec-sfml/installation-de-la-sfml#

Ce qui me permit de taper les commandes :

sudo apt-get install libgl1-mesa-dev
etc..
Avec toutes les librairies indiquées en bas de page.
J'ai renoncé à utiliser Codeblocks pour ses linkers, je l'utilise simplement pour modifier mes codes et sauvegarder mes cpp.
Je compile avec le terminal grâce aux commandes :
g++ -c main.cpp
g++ -o main main.o -lsfml-graphics -lsfml-window -lsfml-system
Ce qui est certes un peu plus long mais fonctionne désormais !
Merci pour ton aide, si je n'avais pas jeté un œil aux dépendances je pense que j'aurais été un peu trop paumé pour continuer ^^'

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Linux : SFML et Codeblocks
« Réponse #9 le: Février 20, 2016, 05:36:22 pm »
Une fois que tu auras compris comment fonctionnent les dépendances , aucun ide comme codeblock ne te poseras de problème, il ne faut pas brûler les étapes, dans ton cas, c'est l'utilisation de linux en général.
un bon ide sous linux, codelite par exemple fonctionne très bien.

edit:

ton lien SFML sur openclassroom traite d'une ancienne version de la sfml.
« Modifié: Février 20, 2016, 05:38:46 pm par Cpl.Bator »

 

anything