Bonjour à tous,
Apprenant actuellement le C++ tout en réalisant de petits projets persos, j'en vient à essayer de simplifier un peu mes programmes utilisant des classes communes. Par exemple, j'ai réalisé une classe permettant de réaliser des calculs sur des vecteurs (cross products, distances entre deux points etc...), qui doit pouvoir être utilisée dans au moins deux de mes programmes (et plus à venir).
Bien que ma classe zvector (oui c'est comme ça que je l'ai nomée...) soit loin d'être finalisée et nécessite d'être améliorée sur plusieurs points, j'en ai néanmoins besoin pour tester mes différents programmes. J'ai donc pensé à en faire une librairie dynamique, ce qui me permettrait de voir directement l'impact des modification de cette dernière sur les programmes l'utilisant.
Mais voilà le problème : je n'en ai jamais fait ! Aussi je pensais que cela serait "simple" (en tout cas, l'idée ne me parait pas compliquée) mais je galère tout de même.
Voici, pour mes premiers essais, le processus de compilation utilisé :
1 2 3 4 5 6 7 8 9 10
|
# création du zvector.o avec -fPIC :
g++ -W -Wall -Werror -Wextra -O6 -fPIC -c zvector.cpp
# création du zvector.so en partagé :
g++ -shared -o zvector.so zvector.o
# essai de compilation d'un programme quelconque avec linkage du zvector.so
g++ -W -Wall -Werror -Wextra -O6 -L$(ZVECT_LIB_PATH) main.cpp zvector.so -o zvect.ex |
Bon, les options de compilation ne sont pas les définitives (les -W -Wall -O6 etc...) et sont inutiles sur la dernière ligne je pense, mais comptant passer, par la suite par un makefile, je referais tout ça à l'occasion.
Le processus ci-dessus me sort donc bien un zvector.so et un zvect.ex. Seulement, lorsque j'exécute le zvect.ex, j'obtient l'erreur suivante :
./zvect.ex: error while loading shared libraries: zvector.so: cannot open shared object file: No such file or directory
Première idée qu'il me vient, c'est que le .so n'est pas dans les dossiers /usr/lib ou autre... Cependant, je souhaiterais conserver le .so dans le dossier de l'exécutable. J'ai donc bien pensé à faire un lien symbolique. Cependant, je n'aime pas l'idée de venir bidouiller / modifier les dossiers systèmes avec des fichiers que je ne penserais pas à supprimer quand je n'en aurais plus l'utilité.
Mes questions sont donc les suivantes :
- Mon processus est-il correcte ?
- y a t'il un moyen de dire à l'exécutable de venir chercher dans son dossier avant d'aller chercher dans les dossiers systèmes ?
Je précise aussi que mon code (les *.cpp) ne sont absolument pas modifié. Je les ai codés exactement comme si je compilais exécutable en direct. Peut-être est-ce là aussi un problème ?
EDIT : j'ai lu aussi le "tuto" présent ici (yolinux) mais je ne comprends pas l'idée de faire plusieurs liens, avec des .so.1.0 et .so.1 etc...
D'avance, merci pour vos retours !
Partager