2010-08-04 9 views
1

J'ai actuellement du code C++ que je veux compiler dans une bibliothèque partagée que je peux lier dynamiquement à une application Java pendant l'exécution en utilisant l'interface Java native (JNI). Le problème auquel je suis confronté est le code C++ que j'essaie de compiler des appels sur une autre bibliothèque elle-même, en utilisant beaucoup de classes et de fichiers d'en-têtes différents. Quand j'essaye de le faire dans un fichier .dll, j'obtiens beaucoup d'erreurs d'éditeur de liens (en disant que j'ai des symboles externes non résolus - qui appartiennent tous au code source que mon code C++ appelle). Maintenant, je ne veux pas avoir à copier tout le code externe (qui est en fait une bibliothèque appelée VTK) dans ma propre source - je veux juste une bibliothèque lienable dynamiquement qui a ma propre fonctionnalité de code C++ (ce qui veut dire qu'elle le ferait besoin de pouvoir reconnaître le code externe que je ne veux pas dupliquer).Liaison d'erreurs lors de la création d'une bibliothèque partagée

N'hésitez pas à poser vos questions principales.

Répondre

1

Lorsque vous liez une DLL Windows, vous devez lui indiquer l'emplacement des symboles qu'elle utilise mais qu'elle ne définit pas. Si vous liez sur une bibliothèque statique, tout le code de cette bibliothèque sera copié dans votre DLL. Toutefois, si vous liez sur une autre DLL, le code de cette bibliothèque reste dans la DLL et tout ce qui est lié à votre DLL sont des liens vers l'autre DLL. Donc, si VTK est fourni en tant que DLL, vous devriez être en mesure de lier contre lui et ne pas gonfler votre propre DLL. La partie délicate est que, pour une DLL donnée, vous ne liez pas réellement avec le fichier .dll lui-même, vous liez à ce qu'on appelle une "bibliothèque d'importation", qui a généralement le même nom de base que la DLL et. extension lib. Donc, si VTK est disponible sous la forme d'un fichier VTK.dll, vous devriez rechercher un fichier VTK.lib correspondant, et l'ajouter à la commande link qui construit votre DLL.

+0

Une idée de comment je pourrais le faire en utilisant cmake? – sparkFinder

2

Vous devrez établir un lien avec l'autre bibliothèque, soit de manière statique (s'il s'agit d'une bibliothèque statique statique), soit dynamiquement s'il s'agit d'une DLL. Il n'y a pas d'autre moyen de s'assurer que l'éditeur de liens et le chargeur peuvent résoudre les symboles.