Je travaille avec OpenCV et je voudrais mettre la bibliothèque entière à l'intérieur de son propre espace de noms. J'ai regardé autour de lui un peu mais je n'ai pas trouvé de réponse ... p>
pouvez-vous faire cela sans modifier le code source de la bibliothèque? Si alors comment? P>
4 Réponses :
Vous pouvez en principe écrire un programme qui permettrait d'analyser les tables d'exportation de symboles de la bibliothèque et de modifier les noms des symboles. Vous devez toujours changer les en-têtes bien sûr. P>
qui dit qu'il serait beaucoup plus facile d'écrire un script simple pour ajouter des balises d'espace de noms et recompiler la bibliothèque. P>
Je l'ai fait une fois pour travailler autour des affrontements de nom laid dans une bibliothèque tierce. Mon conseil fort est: ne B>! C'est horrible.
Ou vous pouvez simplement utiliser Objcopy qui a la capacité de modifier les symboles :-p.
@Évan, vous devez toujours comprendre comment ils sont mutilés sur votre système
@bdonlan: True ... Si I> Ils sont mutilés du tout. Si nous parlons d'une API de style C, alors pas d'inquiétude;). Malheureusement, l'OP n'était pas spécifique à cet égard.
Fondamentalement no. Vous pourriez essayer de le faire en écrivant des emballages et des macros, mais il serait peu probable que cela fonctionne. Si vous avez vraiment besoin de faire cela, une meilleure approche consiste à rechercher la bibliothèque et à faire les ajouts d'espace de noms indispensables. Bien sûr, vous auriez vraiment besoin de le faire pour prendre cette approche et je soupçonne que vous ne le faites pas. P>
Et le conseil le plus sage, sûrement?
Vous pouvez fournir un fichier d'en-tête de wrapper qui déclare la même interface à l'intérieur d'un espace de noms. Dans votre fichier source wrapper, incluez les en-têtes de la bibliothèque et appelez cette bibliothèque. Aucune source en dehors de votre source n'a besoin de connaître les symboles de la bibliothèque. Si vous voulez être vraiment prudent, vous pouvez mettre tout cela à l'intérieur d'une bibliothèque chargée de manière dynamique. P>
Il était très courant de le faire avec COM pour masquer les dépendances de la liaison de certaines bibliothèques. Vous ne pouvez pas voir pourquoi vous ne pouvez pas le faire avec C ++. P>
La réponse générale est que vous ne pouvez pas, mais il y a quelques astuces que vous pouvez faire.
Par exemple, L'utilisation est assez simple, quelque chose comme ceci: p> objcopy --prefix-symbols "__mylib_" object.o new_object.o
Je viens de regarder le site Web OpenCV. Il semble que toutes les fonctions sont préfixées avec un "CV". Alors que les espaces de noms sont une meilleure solution, je me demande, avez-vous des collisions de symboles?
Je n'ai pas de collisions réelles, il suffit de garder les choses organisées car je fais que je fais du wrapper de certaines structures de données OpenCV et que je voudrais les mettre dans la même espace de noms.