Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 04/01/2012, à 16:56

magestik

[Résolu] LD_PRELOAD et Python

Bonjour,

Je suis en train de faire un petit wrapper OpenGL en C. Il marche plutôt bien sur la plupart des programmes en C/C++. Mais quand j'essaye de l'utiliser sur un programme Python qui utilise pyOpenGL ça plante !


LD_PRELOAD=./glQuadBufferEmu.so glxgears -stereo

Fonctionne sans problème :

QuadBufferEmuInit
...

mais

LD_PRELOAD=./glQuadBufferEmu.so python serveur.py

plante :

QuadBufferEmuInit
QuadBufferEmuInit
sh: symbol lookup error: /home/bastien/Documents/Stereo3D/Quad-Buffer-Emu/glQuadBufferEmu.so: undefined symbol: dlopen
QuadBufferEmuInit
sh: symbol lookup error: /home/bastien/Documents/Stereo3D/Quad-Buffer-Emu/glQuadBufferEmu.so: undefined symbol: dlopen
Traceback (most recent call last):
  File "serveur.py", line 10, in <module>
    from OpenGL.GL import *
  File "/usr/lib/pymodules/python2.7/OpenGL/GL/__init__.py", line 2, in <module>
    from OpenGL.raw.GL import *
  File "/usr/lib/pymodules/python2.7/OpenGL/raw/GL/__init__.py", line 6, in <module>
    from OpenGL.raw.GL.constants import *
  File "/usr/lib/pymodules/python2.7/OpenGL/raw/GL/constants.py", line 7, in <module>
    from OpenGL import platform, arrays
  File "/usr/lib/pymodules/python2.7/OpenGL/platform/__init__.py", line 36, in <module>
    _load()
  File "/usr/lib/pymodules/python2.7/OpenGL/platform/__init__.py", line 27, in _load
    plugin_class = plugin.load()
  File "/usr/lib/pymodules/python2.7/OpenGL/plugins.py", line 14, in load
    return importByName( self.import_path )
  File "/usr/lib/pymodules/python2.7/OpenGL/plugins.py", line 28, in importByName
    module = __import__( ".".join(moduleName), {}, {}, moduleName)
  File "/usr/lib/pymodules/python2.7/OpenGL/platform/glx.py", line 8, in <module>
    class GLXPlatform( baseplatform.BasePlatform ):
  File "/usr/lib/pymodules/python2.7/OpenGL/platform/glx.py", line 20, in GLXPlatform
    raise ImportError("Unable to load OpenGL library", *err.args)
ImportError: ('Unable to load OpenGL library', 'GL: cannot open shared object file: No such file or directory', 'GL', None)


Petite précision : ça marche quand je lance juste l'intérpreteur python

LD_PRELOAD=./glQuadBufferEmu.so python

QuadBufferEmuInit
Python 2.7.2+ (default, Oct  4 2011, 20:03:08)
[GCC 4.6.1] on linux2
...

Et bien sur, le programme python fonctionne si je fais pas mon PRELOAD :

python serveur.py

Appuyez sur ECHAP pour quitter
Appuyez sur F pour activer/désactiver le mode plein écran
...


Donc le problème viendrait de Python qui arrive pas à charger OpenGL si on a un wrapper (LD_PRELOAD) sur OpenGL ? Pourtant j'ai vu sur des sites que les wrapper avec LD_PRELOAD marchent avec Python ! Pourtant la première erreur dit qu'il trouve pas dlopen dans ma librairie pourtant quand c'est pas un programme python ça marche ...

Voilà le git contenant mon code : https://github.com/magestik/glQuadBufferEmu Tout ce qui concerne les dlopen est dans le fichier main.c !

Merci d'avance.


RESOLU : Il fallait mettre -ldl et -lglut à la fin de la ligne de compilation (gcc) !

Dernière modification par magestik (Le 04/01/2012, à 19:11)

Hors ligne