SIP Le sujet est résolu

Tout ce qui concerne la programmation.
Répondre
Avatar de l’utilisateur
Dunatotatos
Membre
Membre
Messages : 425
Inscription : 11 mai 2016, 20:56
Status : Hors-ligne

Salut,

J'apprends l'usage de SIP (pas le protocole, mais le générateur de code). Pour cela, je suis ce tuto :
http://pyqt.sourceforge.net/Docs/sip4/using.html
Dans la section C++, tout fonctionne comme il faut, jusqu'à :

Code : Tout sélectionner

$ make
g++ -c -g -O2 -fstack-protector-strong -Wformat -Werror=format-security  -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -Wall -W -DNDEBUG -I. -I/usr/include/python2.7 -o sipwordcmodule.o sipwordcmodule.cpp
g++ -c -g -O2 -fstack-protector-strong -Wformat -Werror=format-security  -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -Wall -W -DNDEBUG -I. -I/usr/include/python2.7 -o sipwordWord.o sipwordWord.cpp
g++ -Wl,-z,relro -shared -Wl,--version-script=word.exp -o word.so sipwordcmodule.o sipwordWord.o -lword
/usr/bin/ld: cannot find -lword
collect2: error: ld returned 1 exit status
Makefile:36: recipe for target 'word.so' failed
make: *** [word.so] Error 1
J'ai fait un copier-coller des fichiers présentés dans le tuto pour être sûr de ne pas avoir introduit d'erreur. En regardant ce qu'il se passe, je me suis dit qu'il y avait peut-être une erreur dans le tuto, et ai remplacé dans configure.py

Code : Tout sélectionner

< makefile.extra_libs = ["word"]
---
> makefile.extra_libs = []
Le make fonctionne :

Code : Tout sélectionner

$ python configure.py 
$ make
g++ -c -g -O2 -fstack-protector-strong -Wformat -Werror=format-security  -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -Wall -W -DNDEBUG -I. -I/usr/include/python2.7 -o sipwordcmodule.o sipwordcmodule.cpp
g++ -c -g -O2 -fstack-protector-strong -Wformat -Werror=format-security  -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -Wall -W -DNDEBUG -I. -I/usr/include/python2.7 -o sipwordWord.o sipwordWord.cpp
g++ -Wl,-z,relro -shared -Wl,--version-script=word.exp -o word.so sipwordcmodule.o sipwordWord.o
Mais ça bloque à l'import :

Code : Tout sélectionner

$ python
Python 2.7.12 (default, Jun 29 2016, 08:18:26) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import word
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: ./word.so: undefined symbol: _ZNK4Word7reverseEv
Help ?
Avatar de l’utilisateur
vohu
Membre
Membre
Messages : 455
Inscription : 16 avr. 2016, 12:02
Localisation : Strasbourg
Status : Hors-ligne

Il faut que tu installes cette libword
Avatar de l’utilisateur
Dunatotatos
Membre
Membre
Messages : 425
Inscription : 11 mai 2016, 20:56
Status : Hors-ligne

Mais libword fait référence à la librairie que j'essaie de wrapper. Pas moyen de l'installer, puisque je la compile en ce moment même.

Du coup, j'ai essayé de compiler le fichier .ccp tout seul (sans SIP), pour générer un .so :

Code : Tout sélectionner

g++ -shared -fPIC -o libword.so word.cpp
Et ça marche plutôt bien. J'ai bien le fichier .so. Par contre, g++ n'est toujours pas content (même erreur). J'ai essayé de trouver la bibliothèque avec ld, sans succès :

Code : Tout sélectionner

$ ls
configure.py  sipAPIword.h        sipwordWord.cpp  word.exp  word.sbf
libword.so    sipwordcmodule.cpp  sipwordWord.o    word.h    word.sip
Makefile      sipwordcmodule.o    word.cpp         word.o
$ LIBRARY_PATH=$(pwd):
$ export LIBRARY_PATH
$ ld -lword --verbose
==================================================
attempt to open //usr/local/lib/x86_64-linux-gnu/libword.so failed
attempt to open //usr/local/lib/x86_64-linux-gnu/libword.a failed
attempt to open //lib/x86_64-linux-gnu/libword.so failed
attempt to open //lib/x86_64-linux-gnu/libword.a failed
attempt to open //usr/lib/x86_64-linux-gnu/libword.so failed
attempt to open //usr/lib/x86_64-linux-gnu/libword.a failed
attempt to open //usr/local/lib64/libword.so failed
attempt to open //usr/local/lib64/libword.a failed
attempt to open //lib64/libword.so failed
attempt to open //lib64/libword.a failed
attempt to open //usr/lib64/libword.so failed
attempt to open //usr/lib64/libword.a failed
attempt to open //usr/local/lib/libword.so failed
attempt to open //usr/local/lib/libword.a failed
attempt to open //lib/libword.so failed
attempt to open //lib/libword.a failed
attempt to open //usr/lib/libword.so failed
attempt to open //usr/lib/libword.a failed
attempt to open //usr/x86_64-linux-gnu/lib64/libword.so failed
attempt to open //usr/x86_64-linux-gnu/lib64/libword.a failed
attempt to open //usr/x86_64-linux-gnu/lib/libword.so failed
attempt to open //usr/x86_64-linux-gnu/lib/libword.a failed
ld: cannot find -lword
Je ne sais pas comment indiquer à ld de chercher dans le répertoire courant. J'ai fixé la variable LIBRARY_PATH et LD_LIBRARY_PATH, mais rien n'y fait.

EDIT : En utilisant l'option -L. de ld, je trouve le fichier .so. Mais ça ne m'arrange pas, ça veut dire qu'il faut bidouiller le Makefile. Je saurais faire, mais l'installation devient un peu sale.
Avatar de l’utilisateur
vohu
Membre
Membre
Messages : 455
Inscription : 16 avr. 2016, 12:02
Localisation : Strasbourg
Status : Hors-ligne

copie ton libword.so dans un des dossier qu'il te donne
Avatar de l’utilisateur
Dunatotatos
Membre
Membre
Messages : 425
Inscription : 11 mai 2016, 20:56
Status : Hors-ligne

Ce n'est pas vraiment l'objectif. À terme, je veux générer des librairies statiques, et que tous les fichiers du processus restent dans un dossier build/. Seule la librairie statique à importer en Python sera à mettre au bon endroit sur le système.

EDIT : Il doit y avoir une option adéquate dans le configure.py que l'on donne à SIP.
Avatar de l’utilisateur
Dunatotatos
Membre
Membre
Messages : 425
Inscription : 11 mai 2016, 20:56
Status : Hors-ligne

Hop, j'ai trouvé ! C'est l'option LFLAGS de sipconfig. J'ai réécrit le configure.py :

Code : Tout sélectionner

import os
import sipconfig

build_file = "word.sbf"
config = sipconfig.Configuration()

config_dict = config.build_macros()
config_dict['LFLAGS'] += ",-L."
config.set_build_macros(config_dict)

os.system(" ".join([
    config.sip_bin,
    "-c", "." , "-b",
    build_file,
    "word.sip"]))

makefile = sipconfig.SIPModuleMakefile(config, build_file)

makefile.extra_libs = ["word"]
makefile.generate()
Et le make fonctionne comme sur des roulettes.

L'utilisation en Python donne encore des résultats bizarres, mais ça doit être mon code en C qui est merdique.
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 4935
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

si c'est résolu, n'oublie pas la coche verte.
Et merci pour la solution!
Avatar de l’utilisateur
Dunatotatos
Membre
Membre
Messages : 425
Inscription : 11 mai 2016, 20:56
Status : Hors-ligne

Oups, désolé. Pas l'habitude de la coche dans cette section.
Répondre