Utilisation de pybind11

Coucou ici,

Je tente de générer un binding python pour une librairie. Pour le moment, je ne gère qu’une classe avec une seule méthode.

Mais quoi que je fasse, j’obtiens toujours une erreur “undefined symbol”.

Quelques infos :

  • La librairie compile bien, en dynamique ou en statique.
  • j’ai réussi à générer les exemples donnés par pybind11 dans leur tutoriel (les premiers pas quoi)
  • la commande que j’utilise pour compiler est un poil complexe :

g++ -O3 -Wall -shared -std=c++11 -fPIC $(python3 -m pybind11 --includes) -ISFML/include -Lbuild/lib -lsfml-system pysfml2/example.cpp -o example$(python3-config --extension-suffix)

la librairie a été compilée dans le répertoire build/lib et son nom est libsfml-system.so ou bien libsfml-system-s (pour la version statique), mon fichier pybind11 est pysfml2/main.cpp.

La compilation se passe bien, mais si j’importe le résultat :

>>> import example
ImportError: /[...]/sfml/example.cpython-312-x86_64-linux-gnu.so: undefined symbol: _ZNK2sf4Time9asSecondsEv

Il ne trouve donc ps le symbole sf::Time.asSeconds.

Tout idée est la bienvenue :slight_smile:

Je dirais qu’il manque la lib sfml au runtime (il ne la trouve pas).

Deux pistes pour explorer ça, strace pour le voir essayer et échouer de charger la libsmfl,

strace -s999 -o import.strace python -c 'import example'
grep smfl import.strace

et tester en lui ajoutant le dossier dans lequel se trouve la lib :

LD_LIBRARY_PATH=build/lib python -c 'import example'
1 « J'aime »

ok, donc tu penses qu’il ne trouve pas la lib à charger dynamiquement donc au moment où je fais l’import ?
J’y ai pensé hier soir et j’avais tenté un “sudo make install” de la lib, mais elle n’est peut-être pas dans le PATH pour autant.

In fine, est-ce que c’est possible de faire une lib qui embarquerait cette lib là ? Donc plus de souci de path ou quoi, tout est dans le module final ?

Pour ça j’ai ajouté “-static” à la compilation du module, mais il m’a sorti une erreur et j’ai abandonné pour le moment.

Je re-ressaye ça ce soir, merci !

Trouvé !
C’était “juste” un souci de positionnement des librairies lors de la compilations. Je les avais positionnées avant le fichier source… Tu parles d’un truc !

Tu parles d’un truc !

Huhu - j’avais publié une longue série d’articles à l’époque :

Content de voir que certaines choses n’ont pas changé :stuck_out_tongue:

PS: au besoin y a un exemple avec cffi, que j’ai trouvé plus facile à utiliser que pybind11 - à toi de voir