Как связать плагин, который подключается к приложению через dlopen () - PullRequest
4 голосов
/ 01 июня 2011

Я пишу плагин для приложения.Приложение загрузит плагин, используя dlopen().Платформа - Fedora Linux 11. У меня есть весь исходный код приложения.

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

У меня возникли проблемы при сборке кода в качестве плагина.Я строю его как общую (.so) библиотеку.Мой код, естественно, ссылается на символы в приложении, поэтому мне нужно указать библиотеки, на которые плагин ссылается, используя опции g++ -L и -l.Тем не менее, приложение, которое принимает мой плагин, представляет собой один исполняемый файл, а не набор .so библиотек.

Здесь я упускаю некоторые основные моменты.Как мне связать мой плагин?

Обратите внимание, что я все еще пытаюсь просто создать свой плагин - я еще не дошел до того, что я пытаюсь загрузить его с помощью dlopen().

РЕШЕНИЕ: Спасибо всем за ваши ответы.Я использовал метод --just-symbols, предложенный nemo, и он отлично работал.Спасибо!

Ответы [ 3 ]

2 голосов
/ 01 июня 2011

Один из подходов заключается в том, чтобы плагин не связывался напрямую с символами.dlopen () может загружать текущий процесс как «библиотеку», используя путь NULL, но для этого требуется, чтобы в GCC был установлен флаг -rdynamic.То есть, как работает Glade, когда вы устанавливаете обратные вызовы в своего рода XML-файле, и он просто «волшебным образом» работает.Т ссылку на них.Это, конечно, требует, чтобы архитектура плагина была разработана для такого рода вещей.

1 голос
/ 01 июня 2011

Предназначено ли приложение для использования плагинов? Если так, я бы сказал, что его интерфейс (и его отсутствие) плохо спроектирован. Приложение должно предоставлять библиотеку, которую могут использовать плагины, подобные вашей, без необходимости прибегать к временным решениям и способам взлома.

1 голос
/ 01 июня 2011

Я думаю, вам нужна опция "- R" (он же "--just-symbols") для компоновщика.

Так что, если myexe - это главный объект:

g++ -Wl,--just-symbols=myexe -L... -l... -shared -o plugin.so plugin.o

P.S. Это предполагает, что myexe сам был связан с --export-dynamic. В противном случае ваш .so не может ссылаться на символы внутри исполняемого файла, поскольку они не экспортируются.

...