Forum de la communauté SFML
Aide => Général => Discussion démarrée par: Gorf le Mai 11, 2013, 03:36:31 pm
-
Bonjour, j'ai hier enfin compilé la SFML2 moi-même (et mis à jour GCC en 4.8 aussi), et lorsque j'utilise la build en statique que j'ai fait (.a), le compilateur me sort ça :
/usr/local/lib/libsfml-window-s.a(WindowImplX11.cpp.o): In function `sf::priv::WindowImplX11::setMouseCursorVisible(bool)':
WindowImplX11.cpp:(.text+0x6f): undefined reference to `XDefineCursor'
/usr/local/lib/libsfml-window-s.a(WindowImplX11.cpp.o): In function `sf::priv::WindowImplX11::setVisible(bool)':
WindowImplX11.cpp:(.text+0xb3): undefined reference to `XUnmapWindow'
WindowImplX11.cpp:(.text+0xd1): undefined reference to `XMapWindow'
/usr/local/lib/libsfml-window-s.a(WindowImplX11.cpp.o): In function `sf::priv::WindowImplX11::setSize(sf::Vector2<unsigned int> const&)':
WindowImplX11.cpp:(.text+0x10d): undefined reference to `XResizeWindow'
/usr/local/lib/libsfml-window-s.a(WindowImplX11.cpp.o): In function `sf::priv::WindowImplX11::getPosition() const':
WindowImplX11.cpp:(.text+0x15e): undefined reference to `XGetWindowAttributes'
/usr/local/lib/libsfml-window-s.a(WindowImplX11.cpp.o): In function `sf::priv::WindowImplX11::getSize() const':
WindowImplX11.cpp:(.text+0x1ae): undefined reference to `XGetWindowAttributes'
/usr/local/lib/libsfml-window-s.a(WindowImplX11.cpp.o): In function `sf::priv::WindowImplX11::setPosition(sf::Vector2<int> const&)':
WindowImplX11.cpp:(.text+0x1fd): undefined reference to `XMoveWindow'
/usr/local/lib/libsfml-window-s.a(WindowImplX11.cpp.o): In function `sf::priv::WindowImplX11::setIcon(unsigned int, unsigned int, unsigned char const*)':
WindowImplX11.cpp:(.text+0x3c5): undefined reference to `XCreateImage'
WindowImplX11.cpp:(.text+0x410): undefined reference to `XCreatePixmap'
WindowImplX11.cpp:(.text+0x441): undefined reference to `XCreateGC'
WindowImplX11.cpp:(.text+0x497): undefined reference to `XPutImage'
WindowImplX11.cpp:(.text+0x4b0): undefined reference to `XFreeGC'
WindowImplX11.cpp:(.text+0x6b0): undefined reference to `XCreatePixmapFromBitmapData'
WindowImplX11.cpp:(.text+0x6b7): undefined reference to `XAllocWMHints'
WindowImplX11.cpp:(.text+0x6e5): undefined reference to `XSetWMHints'
WindowImplX11.cpp:(.text+0x6ed): undefined reference to `XFree'
WindowImplX11.cpp:(.text+0x6fb): undefined reference to `XFlush'
/usr/local/lib/libsfml-window-s.a(WindowImplX11.cpp.o): In function `sf::priv::WindowImplX11::setTitle(sf::String const&)':
WindowImplX11.cpp:(.text+0xb66): undefined reference to `XInternAtom'
WindowImplX11.cpp:(.text+0xb8a): undefined reference to `XInternAtom'
WindowImplX11.cpp:(.text+0xbc9): undefined reference to `XChangeProperty'
WindowImplX11.cpp:(.text+0xc14): undefined reference to `XStoreName'
/usr/local/lib/libsfml-window-s.a(WindowImplX11.cpp.o): In function `sf::priv::WindowImplX11::switchToFullscreen(sf::VideoMode const&)':
WindowImplX11.cpp:(.text+0xdcd): undefined reference to `XQueryExtension'
WindowImplX11.cpp:(.text+0xdfc): undefined reference to `XRRGetScreenInfo'
WindowImplX11.cpp:(.text+0xe16): undefined reference to `XRRConfigCurrentConfiguration'
WindowImplX11.cpp:(.text+0xe2f): undefined reference to `XRRConfigSizes'
WindowImplX11.cpp:(.text+0xea6): undefined reference to `XRRSetScreenConfig'
WindowImplX11.cpp:(.text+0xeb4): undefined reference to `XRRFreeScreenConfigInfo'
/usr/local/lib/libsfml-window-s.a(WindowImplX11.cpp.o): In function `sf::priv::WindowImplX11::createHiddenCursor()':
WindowImplX11.cpp:(.text+0xf86): undefined reference to `XCreatePixmap'
WindowImplX11.cpp:(.text+0xfaa): undefined reference to `XCreateGC'
WindowImplX11.cpp:(.text+0xfd2): undefined reference to `XDrawPoint'
WindowImplX11.cpp:(.text+0xfe4): undefined reference to `XFreeGC'
WindowImplX11.cpp:(.text+0x1030): undefined reference to `XCreatePixmapCursor'
WindowImplX11.cpp:(.text+0x1048): undefined reference to `XFreePixmap'
/usr/local/lib/libsfml-window-s.a(WindowImplX11.cpp.o): In function `sf::priv::WindowImplX11::initialize()':
WindowImplX11.cpp:(.text+0x10a2): undefined reference to `XInternAtom'
WindowImplX11.cpp:(.text+0x10d2): undefined reference to `XSetWMProtocols'
WindowImplX11.cpp:(.text+0x10f8): undefined reference to `XOpenIM'
WindowImplX11.cpp:(.text+0x1144): undefined reference to `XCreateIC'
WindowImplX11.cpp:(.text+0x1166): undefined reference to `XMapWindow'
WindowImplX11.cpp:(.text+0x1174): undefined reference to `XFlush'
/usr/local/lib/libsfml-window-s.a(WindowImplX11.cpp.o): In function `sf::priv::WindowImplX11::WindowImplX11(unsigned long)':
WindowImplX11.cpp:(.text+0x12c0): undefined reference to `XSelectInput'
/usr/local/lib/libsfml-window-s.a(WindowImplX11.cpp.o): In function `sf::priv::WindowImplX11::WindowImplX11(sf::VideoMode, sf::String const&, unsigned long)':
WindowImplX11.cpp:(.text+0x142c): undefined reference to `XCreateWindow'
WindowImplX11.cpp:(.text+0x14bf): undefined reference to `XQueryExtension'
WindowImplX11.cpp:(.text+0x14ee): undefined reference to `XRRGetScreenInfo'
WindowImplX11.cpp:(.text+0x150b): undefined reference to `XRRConfigCurrentConfiguration'
WindowImplX11.cpp:(.text+0x1527): undefined reference to `XRRConfigSizes'
WindowImplX11.cpp:(.text+0x1592): undefined reference to `XRRSetScreenConfig'
WindowImplX11.cpp:(.text+0x15a4): undefined reference to `XRRFreeScreenConfigInfo'
WindowImplX11.cpp:(.text+0x15f0): undefined reference to `XInternAtom'
WindowImplX11.cpp:(.text+0x16cd): undefined reference to `XChangeProperty'
WindowImplX11.cpp:(.text+0x1709): undefined reference to `XSetWMNormalHints'
Voilà, je suis sous Ubuntu 12.04 avec GCC 4.8 donc, la SFML2.
Apparemment, c'est un problème avec Xlib, faut-il en installer la version statique aussi ?
Au cas-ou, j'ai aussi compilée en .so, mais pour plus de praticité à l'installation de mon programme, je préfèrerais la statique.
Merci de vos réponses.
PS : 1 Euro que Laurent sera premier ! ;D
-
Tu compiles comment ? problème de lien a priori.
-
Tiens, j'ai perdu mon pari ;)
Et bien, je ne compile pas vraiment, je fais comme le tuto, je DL les sources, puis j'utilise CMake, qui fonctionne sans erreur et me sort les .a .
.a que je met dans /usr/local/lib/ comme toujours.
Pour le programme, je compile avec Code::Blocks, mais g++ en console me sort la même chose (C::B l'utilisant).
Alors oui, c'est un problème de lien, j'ai remarqué :) , mais la question que je pose est :
Est-ce que SFML2 en Statique essaye de linker une sorte de Xlib.a ? Car si oui, je pourrais ne pas l'avoir.
-
en toute logique non , si tu lie en statique , à toi aussi de lier le reste , donc , toute les dépendance de la sfml , en dynamique ou statique.
-
Tiens, je ne savais pas qu'on pouvait mettre SFML2 en static sur Linux. Dans ce cas, je vais illico m'y mettre !
-
Désolé pour le retard ;D
Alors en effet, une bibliothèque statique n'est rien d'autre qu'une archive de fichiers compilés (.o). Il n'y a donc aucune étape d'édition de liens, celle-ci se faisant uniquement lors de la création du binaire final qui dépend de la bibliothèque statique. Donc tu dois lier toi-même toutes les dépendances de SFML à ton projet (la liste se trouve dans la tutoriel CMake).
Sous Windows, étant donné qu'on utilise souvent les bibliothèques statiques, j'ai feinté pour éviter cette étape fastidieuse. Mais il faut savoir que c'est cracra et que normalement il faudrait le faire aussi (lier toutes les dépendances au niveau du binaire final).
-
Je suis sur la bonne voie mais je pense qu'il me manque des dépendances, pourtant j'ai ajouté les libs lister dans la doc (voir images). J'ai surement dû en oublier ou alors je n'ai pas pris les bonnes.
[attachment deleted by admin]
-
ta ligne de commande g++ ?
-
J'ai rien mis si ce n'est SFML_STATIC _DEBUG dans le préprocesseur.
-
J'ai réglé pas mal de problème, c'est un problème de lien en fait. Vu que je suis en x86_x64 que je vais piocher dans le répertoire /lib et non /lib64, je ne dois pas indiquer le chemin mais directement le nom de la lib. Y a déjà moins d'erreur :) Manque plus que deux à aller piocher.
-
Super ça compile :) Y en a qui vont être content et puis c'est bien de pouvoir mettre son binaire en static car si ont souhaite mettre l'appli sur une plateforme de téléchargement, on peut pas imposer l'installation de SFML... Super, je suis content là !
-
si c'est en dynamique sur linux , tu fournis les libs avec , (les .so) , au moment de lancer ton application , tu définis le PATH vers tes libs , comme ça pas de problème de forcé qui que ce soit à installer quoi que ce soit.
-
Oui c'est une solution, peut-être que je vais opter pour cette dernière.
En revanche, bien que ça compile, j'ai un segment fault au lancement. gbd ne renvoi pas d'erreur spécifique mais il bloque ça :
pthread_mutex_lock+4: mov 0x10(%rdi),%esi
puis
void MutexImpl::lock()
{
pthread_mutex_lock(&m_mutex);
}
et ainsi de suite avec les lock.
-
Tu as des variables SFML statiques/globales ?
-
Toutes les variables sont statiques. Je vais recommencer depuis le début peut-être que j'ai loupé quelques choses.
-
Je ne sais pas si c'est parlant mais voilà ce que j'utilise
-lsfml-audio-s-d -lsfml-graphics-s-d -lsfml-window-s-d -lsfml-system-s-d -lpthread -lGL -lX11 -lXrandr -lfreetype -lGLEW -ljpeg -lsndfile -lopenal
-
Et bien il s'en est passé des choses ici :o !
Donc tu dois lier toi-même toutes les dépendances de SFML à ton projet (la liste se trouve dans la tutoriel CMake).
Donc je dois linker chaque lib moi-même dans le cas du static...
Je me suis fait rattraper par la paresse :D
Et au final pour garder un éxécutable complet sans besoin de .so/.dll, je devrai trouver toutes les dépendances en static ! Géniaaaal !
Et encore une journée de recherche/compilation...
-
Il ne faut pas déclarer de variables SFML du genre Window ou Texture (i.e. des variables qui font des trucs non anodins dans leur constructeur) dans une portée globale.
-
Je préfère la technique de Cpl.Bator. C'est assez simple et efficace. Un dossier lib dans le répertoire du binaire, on copie le tout, on indique gentiment où se servir et le tour est joué. C'est moins de prises de tête à mon sens. L'essentiel est que ça marche.
-
Je préfère la technique de Cpl.Bator. C'est assez simple et efficace. Un dossier lib dans le répertoire du binaire, on copie le tout, on indique gentiment où se servir et le tour est joué. C'est moins de prises de tête à mon sens. L'essentiel est que ça marche.
Oui, j'ai aussi pensé à ça mais avant il me faudrait une précision, le path des .so à charger se trouve dans le binaire ou le système va les chercher dans le répertoire par défaut ? (/usr/local/lib/ ou /usr/lib/)
-
Je préfère la technique de Cpl.Bator. C'est assez simple et efficace. Un dossier lib dans le répertoire du binaire, on copie le tout, on indique gentiment où se servir et le tour est joué. C'est moins de prises de tête à mon sens. L'essentiel est que ça marche.
Oui, j'ai aussi pensé à ça mais avant il me faudrait une précision, le path des .so à charger se trouve dans le binaire ou le système va les chercher dans le répertoire par défaut ? (/usr/local/lib/ ou /usr/lib/)
Pour faire simple, après avoir compiler tes fichiers *.so, tu crée un dossier lib dans le répertoire où ton binaire est compilé. Puis tu ajoute le dossier lib de ton binaire dans les propriétés de ton projet (exemple : /home/gorf/projets/fatalblaster/lib) et puis tu link les lib du dossier. N'utilise pas les lib du système sinon, ça ne sert à rien, l'utilisateur devra posséder sfml sur son ordinateur.
-
Pour faire simple, après avoir compiler tes fichiers *.so, tu crée un dossier lib dans le répertoire où ton binaire est compilé. Puis tu ajoute le dossier lib de ton binaire dans les propriétés de ton projet (exemple : /home/gorf/projets/fatalblaster/lib) et puis tu link les lib du dossier. N'utilise pas les lib du système sinon, ça ne sert à rien, l'utilisateur devra posséder sfml sur son ordinateur.
Oui oui j'ai compris ça, ce que je demande en fait c'est :
Est-ce que mon programme, utilisé sur un autre ordinateur, ira chercher SFML dans le dossier lib, ou a l'emplacement par défaut. (Si linké avec celles dans le dossier lib). Et ensuite, ça risque de ne toujours pas marcher car SFML ira de toute façon (supposément) chercher ses dépendances dans /usr/local/ et pas dans le dossier lib. Ou alors faut recompiler SFML et changer les Paths.
-
Pour faire simple, après avoir compiler tes fichiers *.so, tu crée un dossier lib dans le répertoire où ton binaire est compilé. Puis tu ajoute le dossier lib de ton binaire dans les propriétés de ton projet (exemple : /home/gorf/projets/fatalblaster/lib) et puis tu link les lib du dossier. N'utilise pas les lib du système sinon, ça ne sert à rien, l'utilisateur devra posséder sfml sur son ordinateur.
Oui oui j'ai compris ça, ce que je demande en fait c'est :
Est-ce que mon programme, utilisé sur un autre ordinateur, ira chercher SFML dans le dossier lib, ou a l'emplacement par défaut. (Si linké avec celles dans le dossier lib). Et ensuite, ça risque de ne toujours pas marcher car SFML ira de toute façon (supposément) chercher ses dépendances dans /usr/local/ et pas dans le dossier lib. Ou alors faut recompiler SFML et changer les Paths.
Il ira naturellement chercher les lib dans /usr/lib, mais ce n'est pas dérangeant. Aujourd'hui, toutes les distributions fournissent d'office toutes les dépendances de SFML.
-
Okay, merci de vos réponses !
Je mets en résolu.
-
Par contre attention, si tu comptes un jour créer des paquets pour une distribution, il est toujours préférable de créer une dépendance avec SFML ;)
-
Pour avoir réussie parfaitement à compiler statiquement SFML dans mon binaire, je voudrais toutefois mettre en garde d'autres personnes qui voudraient opter pour cette solution : réfléchissez bien à vos dépendances et de quelles manières vous allez les lier. Il y a certaines distributions qui disposent de la plupart des lib comme openal, jpeg8, glew etc. D'autres attention, c'est un casse tête assuré. Par exemple Fedora n'embarque que la version de libgc 2.16 et si vous avez travaillé avec libgc 2.17 sur votre machine, il y a aura un souci de lancement. Inutile d'essayer de linker statiquement libgc, vous allez droit à la catastrophe et ce n'est pas viable.
Si vous avez vraiment besoin de linker statiquement la plupart des libs, je vous suggère openal, jpeg et glew. Le reste, on le retrouve facilement dans chaque distribution.