Связывание ошибок при создании общей библиотеки - PullRequest
1 голос
/ 05 августа 2010

В настоящее время у меня есть некоторый код C ++, который я хочу скомпилировать в общую библиотеку, которую я могу динамически связывать с приложением Java во время выполнения, используя собственный интерфейс Java (JNI).Проблема, с которой я сталкиваюсь, - это код на C ++, который я пытаюсь скомпилировать для других библиотек, используя множество классов и различных заголовочных файлов.Когда я пытаюсь превратить его в файл .dll, я получаю много ошибок компоновщика (говоря, что у меня есть неразрешенные внешние символы - все они принадлежат исходному коду, из которого вызывается мой код C ++).Теперь я не хочу копировать весь внешний код (который на самом деле является библиотекой VTK) в мой собственный источник - я просто хочу динамически подключаемую библиотеку, которая имеет функциональность моего собственного кода C ++ (что означает, что он будетнеобходимо иметь возможность распознавать внешний код, который я не хочу дублировать).

Пожалуйста, не стесняйтесь задавать любые наводящие вопросы.

Ответы [ 2 ]

2 голосов
/ 05 августа 2010

Вам придется связываться с другой библиотекой, статически (если это простая статическая библиотека) или динамически, если это DLL. Нет другого способа убедиться, что и компоновщик, и загрузчик могут разрешать символы.

1 голос
/ 05 августа 2010

Когда вы связываете Windows DLL, вы должны указать ей, где можно найти любые символы, которые она использует, но не определяет.Если вы ссылаетесь на статическую библиотеку, весь код этой библиотеки будет скопирован в вашу DLL.Однако, если вы ссылаетесь на другую DLL, код этой библиотеки остается в DLL, и все, что связано с вашей DLL, - это ссылки на другую DLL.Таким образом, если VTK предоставляется как DLL, вы должны иметь возможность ссылаться на него, а не раздувать свою собственную DLL.Одна сложность заключается в том, что для данной DLL вы на самом деле не ссылаетесь на сам файл .dll, а на то, что называется «библиотекой импорта», которая обычно имеет то же базовое имя, что и DLL и a.расширение lib.Поэтому, если VTK доступен в виде файла VTK.dll, вы должны найти соответствующий файл VTK.lib и добавить его в команду ссылки, которая создает вашу DLL.

...