librairie dynamique et instanciation - C++ - Programmation
Marsh Posté le 16-01-2011 à 07:59:48
il te manque un -lcircle pour que ton exécutable soit linké avec libcircle. Même pour un link sur une bibliothèque dynamique, il faut ce genre de chose.
Code :
|
Il faut également avoir précisé le chemin de la bibliothèque avec -L si celle ci ne se trouve pas dans un chemin connu de g++.
Code :
|
Marsh Posté le 16-01-2011 à 08:46:11
codablank a écrit : |
Pour qu'une lib chargée avec dlopen puisse utiliser des symboles du programme principal, il y a des choses à faire (et je ne les retiens pas d'une fois sur l'autre). Regarde les différentes options de gcc, ça me suffit généralement pour retrouver ce qu'il faut.
xilebo a écrit : il te manque un -lcircle pour que ton exécutable soit linké avec libcircle. |
Il utilise dlopen()...
Marsh Posté le 16-01-2011 à 09:08:05
Un Programmeur a écrit : |
Un Programmeur a écrit : |
Désolé, je n'avais pas fait gaffe
Marsh Posté le 16-01-2011 à 12:51:06
Citation : g++ -shared -o libcircle.so circle.cpp |
Et avec:
g++ -fPIC -shared -o libcircle.so circle.cpp test.cpp
A+,
Marsh Posté le 16-01-2011 à 13:57:50
C'est vraisemblablement la solution. J'avais vu qu'il ne mettais pas test.cpp dans libcircle.so et j'avais supposé sans vérifié qu'il le mettais avec main.cpp (ce qui a posteriori est doublement stupide considérant les dépendances déclarées pour libcircle.so).
Marsh Posté le 16-01-2011 à 15:31:54
Codablank, si j'avais eu a écrire ce code, j'aurais plus ou moins fait comme suit:
Code :
|
(Bon, j'ai pas de compilo sous la main, donc pas testé)
Il y a pas de grosses diffs, mais l'emploi des directives préprocesseur permet de n'avoir qu'un endroit à commenter pour utiliser test ou non
Et plutôt que d'avoir un constructeur et un destructeur publics sans paramètres, l'emploi d'une classe friend me parait mieux coller.
Par contre, le déport de
#include <iostream>
dans cercle.h au lieu de cercle.cpp alors que rien dans cercle.h n'utilise iostream, je suis tout à fait contre.
Et dans le même genre de remarque, il n'y a aucune raison de faire figurer test.h dans main.cpp vu qu'on ne fait pas appel à Test dans son code.
A+,
Marsh Posté le 16-01-2011 à 15:38:11
Un dernier point:
Code :
|
Si le nom de ta classe est test, et non pas Test, il va y avoir des problèmes...
Dans le même genre, nommer une classe circle sans majuscule, pourquoi pas, mais utiliser une convention de nommage de base, ça peut faciliter le repérage des erreurs.
A+,
Marsh Posté le 16-01-2011 à 15:57:44
Merci pour toutes vos réponses
effectivement j'avais omis test.cpp dans la compilation de la librairie, donc binaire de Test impossible à trouver pour le main
gilou, merci pour tes corrections, c'était à la base juste un code de test, mais tes conseils vont me permettre de bâtir un chargeur de .so un peu plus propre
à propos existe-il une api standard pour ce genre de chose en C++ ?
Marsh Posté le 16-01-2011 à 16:00:22
Citation : à propos existe-il une api standard pour ce genre de chose en C++ |
Non, ça dépend de l'OS, les librairies partagées/dlls.
Sous unix, selon les unix, ça a toujours été le bordel au niveau des options pour le compilo, les librairies partagées (AIX / SunOS ou Solaris par exemple).
A+,
Marsh Posté le 16-01-2011 à 00:34:12
Bonsoir, après avoir lu le tutorial http://hiko-seijuro.developpez.com/a...que-dynamique/ sur la création de librairie dynamique en c++ sous linux et testé son exemple, je m'interroge sur la manière d'instancier un objet dans le code de la librairie
mettons la classe "circle" (issue du tuto):
j'ai voulu ajouter une autre classe "test" :
j'ai voulu l'instancier dans la méthode "draw" de "circle" :
voici le main.cpp:
je compile en librairie dynamique sans problème avec :
mais à l'exécution, j'obtiens un "undefined symbol: _ZN4TestC1Ev"
ai-je mal instancié ?
si je retire
ça marche nickel et j'ai le résultat attendu