Как правильно связать библиотеку DLL, которая была связана со статической библиотекой и другими общими библиотеками? - PullRequest
0 голосов
/ 27 сентября 2010

Привет, Я надеюсь, что у кого-то есть терпение прочитать это. У меня есть настройки под рукой, что немного смущает меня. У меня есть каталог с исходным кодом C, сгенерированный Eiffel Compiler. Я хочу использовать этот вывод из Java, поэтому мне нужна DLL для JNI, в которой я буду реализовывать некоторые функции JNI. Когда я компилирую код C, он дает мне статическую библиотеку, которая имеет зависимости от некоторых других библиотек. Итак, моя установка:

myDLL.dll (C ++) [зависит от -> staticLib.lib [зависит от -> (sharedlib1, sharedlib2 ...)

Мой проект на C ++ скомпилирован с Eclipse CDT, и я получаю 1 dll. Я могу использовать эту DLL из Java без каких-либо проблем. Во время выполнения требуется только одна DLL в пути. Весь код из статической библиотеки скомпилирован в мою dll, и Java JNI вызывает мою DLL, в свою очередь, использует этот код.

Я хотел использовать ту же DLL из другого проекта C ++. Однако, когда я ссылаюсь только на DLL, компоновщик жалуется на то, что не нашел определенного символа. Этот символ объявляется в статической библиотеке как extern, поэтому он должен находиться где-то в одной из зависимостей статической библиотеки.

Единственный способ связать и скомпилировать DLL в проект C ++ - это также ссылка на статическую библиотеку, которая изначально была включена в DLL. Таким образом, я получаю .exe, который содержит статическую библиотеку дважды: один в DLL, другой в exe.

Поскольку код Java успешно использует DLL, я знаю, что статическая библиотека скомпилирована в DLL, но я не могу не включить ее дважды в свое приложение C ++. Я также нервничаю по поводу включения одной и той же библиотеки дважды. Как все обрабатывается во время выполнения? Может ли это укусить меня неожиданным образом?

Ваши рекомендации по управлению этой настройкой будут высоко оценены.

С наилучшими пожеланиями

Seref

Ответы [ 2 ]

0 голосов
/ 27 сентября 2010

Если символ, к которому вы обращаетесь и который объявлен как extern для этой статической библиотеки, на самом деле не используется кодом, который вы написали для DLL (которая использовала статическую библиотеку), то этот символ наверняка НЕ ​​находится в вашей DLL (поскольку вам DLL это не нужно).

0 голосов
/ 27 сентября 2010

Если ваша «вторая» dll не может быть связана из-за символа, объявленного в статической библиотеке, кажется, что либо вторая dll не должна видеть этот символ (почему он это делает), или также зависит от статической библиотеки.

Кажется, что последний является нежелательным, поэтому вы должны попытаться выяснить, по какому пути компоновщик находит нежелательный символ. Вероятно, через заголовочный файл компилятор видит при включении заголовков yourDLL ...

...