2010-08-04 2 views
1

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

Обращайте внимание на самые важные вопросы.

ответ

1

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

+0

Любая идея, как я мог это сделать с помощью cmake? – sparkFinder

2

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

Смежные вопросы