Динамическая библиотека использует статические библиотеки, появляются неопределенные символы - PullRequest
2 голосов
/ 02 мая 2011

Я ищу решение моей проблемы и просто получаю некоторые подсказки, но я не смог найти никакого последовательного решения: у меня есть код динамической библиотеки (libdyna.so), которая использует функции 3 статических библиотек.(libone.a, libtwo.a, libthree.a) и библиотека log4cpp.И когда я построил его в первый раз, все выглядело нормально, я мог создать 'libdyna.so', но когда вы проверили его с моей тестовой программой java, хотя обертка (jni обертка работает нормально), я получила множество неопределенных ссылок.

Затем я поместил флаг "-z defs" в файл make, и появилось много неопределенных ссылок, и я не смог снова скомпилировать динамическую библиотеку.

Я сделал 'nm'команда с тремя статическими библиотеками, и он экспортирует все функции, которые я правильно использую в dyna lib.Но когда я сделал nm над «libdyna.so», который включает в себя 3 статических библиотеки, я обнаружил неопределенные символы (функции).

Я думаю, что решения должны быть чем-то вроде добавления некоторого флага клинкер, когда я хочу сделать динамический, но я действительно не знаю.Может ли кто-нибудь мне помочь или рассказать какие-нибудь идеи?если какой-то код нужен, пожалуйста, дайте мне знать, и я вставлю его сюда.Большое спасибо.

P / D: Извините за мой плохой английский.

1 Ответ

3 голосов
/ 02 мая 2011

Вы можете использовать параметр компоновщика --whole-archive, он будет включать целые статические библиотеки и, вероятно, решит вашу проблему, хотя библиотека может стать довольно большой.

g++ -shared -o libdyna.so dyna.o -Wl,-whole-archive -la -lb -lc -Wl,-no-whole-archive

man ld:

Для каждого архива, упомянутого в командной строке после параметра --whole-archive, включите каждый объектный файл в архив в ссылка, а не поиск в архиве нужных объектных файлов. Это обычно используется, чтобы превратить архивный файл в общий библиотека, заставляя каждый объект включаться в результирующую общую библиотеку.

Не забудьте закрыть -Wl,-no-whole-archive.

Проверьте также порядок появления библиотек в командной строке gcc, убедитесь, что они находятся после объектных файлов динамической библиотеки, иначе компоновщик их не загрузит. Если, например, libone использует libtwo, важно, чтобы libone появился раньше libtwo. Это может быть альтернативным решением для вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...