7
votes

Symbole de la bibliothèque statique et partagée des conflits?

J'ai un projet qui travaille sur qui utilise FreeImage et OpenCV, nous utilisons actuellement le support JPEG à partir de ces deux (je travaille pour la fixation de cela, mais pour l'instant, il doit rester). Quoi qu'il en soit, Freeimage compile Libjpeg 7.0 dans ses bibliothèques statiques et la bibliothèque HighGui de OpenCV en tant que bibliothèque partagée (sur mon système, Ubuntu 9, j'ai installé Libjpeg 6.2).

Ils se liennent dans une bibliothèque finale utilisée pour relier différents programmes, java wrappers, etc. Tout cela fonctionne bien, aucun conflit de symboles ou quoi que ce soit pendant la compilation / du temps de liaison. Cependant, lorsque je vais ouvrir une image à l'aide de la fonction CVLOADIMAGE OPENCV, elle décède lors de la lecture de l'en-tête, probablement due à des différences entre les en-têtes de 6,2 et 7,0.

Si je diseprète FreeImage (et commentez le code qui le nécessite), les appels OpenCV commencent à travailler à nouveau, il est donc clair que les symboles Static Libjpeg de Freeimage sont en conflit avec des symboles qui seraient chargés de la bibliothèque partagée de Libjpeg. Ce que je ne peux pas comprendre, c'est pourquoi mon compilateur ne jette pas une erreur lors de la liaison à cause des deux ensembles de symboles libjpeg. De plus, j'ai essayé de remplacer l'en-tête JPeglib.h de mon système avec la version 7.0 pour voir temporairement si OpenCV compilée avec cela permettrait ensuite de synchroniser les symboles que FreeImage apporte à la table, à aucun point disponible.

Enfin j'ai mis un imprimeur dans jpeg_read_header dans la libjpeg que Freeimage compile et reconstruit pour voir si OpenCV utilise la définition de FreeImage libjpeg. Il n'a pas été imprimé alors je dois supposer pas.

alors je suppose que mes questions sont

1) Pourquoi ne relie pas à Static libjpeg et à une libjpeg partagée générer des erreurs de liaison en raison de symboles en double?

2) Est-ce que quelqu'un sait pourquoi ces deux choses se confentillent-elles?

Edit: Compiler OpenCV en mode de débogage puis en mode régulier semble avoir à nouveau frappé quelque chose de lâcher et l'a fait fonctionner à nouveau, aucune idée de ce qui se passe.


0 commentaires

3 Réponses :


1
votes

C'est comme ça

Les bibliothèques statiques sont compilées dans les bibliothèques dynamiques sont chargées pendant l'exécution, mais uniquement les symboles qui manquent (je pense). Vous pouvez compiler des bibliothèques partagées dans, puis vous obtenez probablement une collision de symboles.

SO OPENCV utilise des symboles compilés, car ils sont déjà présents, plutôt que ceux des bibliothèques dynamiques. Vous finissez par utiliser des symboles statiques, éventuellement avec différentes signatures, de la perspective de OpenCV.


1 commentaires

Mon hypothèse est que cela utilise une ou les autres bibliothèques, mais peut-être qu'il utilise un peu des deux? Changer l'en-tête que OpenCV compile avec N'a pas réparais le problème après tout ..



6
votes

En règle générale, la liaison est d'accord sur la réception de plusieurs bibliothèques qui résolvent tous les mêmes symboles. Il utilise simplement le premier qu'il trouve. L'ordre des bibliothèques sur votre ligne de commande de liaison déterminera lequel «gagne».

Ceci, au fait, n'est pas vrai des fichiers d'objet. Chaque lieur que j'ai jamais utilisé suppose que vous veux utiliser tous les objets que vous spécifiez et vous plaindre si plus d'un ait le même symbole.


2 commentaires

Tellement probablement, ce serait une ou l'autre version de Libjpeg qui «gagne»? Ainsi, il choisirait la version OpenCV, auquel cas les choses fonctionnent ou changeaient l'en-tête OpenCV utilise lors de la compilation vers la FreeImage, il faut le réparer ... mais ce n'est pas = (


Si celui-ci, le linker sélectionné était différent de celui de l'en-tête que vous avez utilisé, alors je m'attendrais à ce qu'il ne fonctionne pas . Vous auriez besoin de changer d'en-têtes et aussi de réorganiser les Libs sur la ligne de liaison, et même cela est en cours d'échec. Mieux vaut quitter la lib dont vous ne voulez pas utiliser entièrement de la ligne de liaison



2
votes

Vous devez modifier les options de liaison pour exporter uniquement les symboles souhaités, puis tous les symboles du conflit seront cachés en interne dans la liaison statique, alors aucun conflit. Par défaut, tous les symboles sont exportés, c'est le problème. Voir ce lien: http: // www.gnu.org/software/gnulib/manual/html_node/exported-symbols-of-shared-libres.html


0 commentaires