LINUX.ORG.RU

По какому пути разместить плагины для приложения?

 ,


0

1

Есть приложение снабжённое плагинами. Плагины работают, всё хорошо. Однако встал вопрос эксплуатации всего этого безобразия. Приложение на состоит из исполняемого файла с функцией main, библиотеки содержащей интерфейс для плагинов и собственно самих плагинов подгружаемых в рантайме. Мне кажется, что разумнее всего размещать плагины в специальной дирекории лежащей в той же директории, что и библиотека-интерфейс. Собственно вопрос в том как узнать где находится эта библиотека, если её положение зависит от операционной системы и вообще целиком на совести у линкера?

★★★★★

Ответ на: комментарий от Jetty

Для никсов мне это тоже кажется оптимальным вариантом. Но есть ещё и более другие оси. Однако вопрос был скорее в том как вытащить путь по которому будет лежать библиотека-интерфейс с учётом того, что в никсах это /usr/lib$LIBSUFFIX, в винде это скорее всего app_path, в маке и андроиде — вообще хрен знает что.

KblCb ★★★★★
() автор топика

Этим должна заниматься система сборки - только она знает по каким директориям что устанавливается, и она передаёт эти пути компилятору.

Примерно так это делается на cmake:

# это не обязательно, но позволит пользователю/пакаджеру переопределить поддиректории если понадобится
SET(BINDIR "bin" CACHE STRING "Where to install binaries")
SET(PLUGINS_DIR "lib/myapp/plugins" CACHE STRING "Where to install plugins")

# передаём полный путь в код
# в коде можно будет делать dlopen(PLUGINS_PATH "/libmyplugin1.so")
ADD_DEFINITIONS(-DPLUGINS_PATH=\"${CMAKE_INSTALL_PREFIX}/${PLUGINS_DIR}\")

# сборка бинарника
ADD_EXECUTABLE(myapp ${MYAPP_SOURCES})

# сборка плагинов
ADD_LIBRARY(myplugin1 SHARED ${MYPLUGIN1_SOURCES})
ADD_LIBRARY(myplugin2 SHARED ${MYPLUGIN2_SOURCES})

# установка всего
INSTALL(TARGETS myapp DESTINATION ${BINDIR})
INSTALL(TARGETS myplugin1 myplugin2 DESTINATION ${PLUGINS_DIR})

Теперь по умолчанию бинарник поставится в /usr/local/bin, а плагины в /usr/local/lib/myapp/plugins, и приложение будет об этом знать. При желании пользователь/пакаджер может переопределить как префикс, так и поддиректории, все будет установлено согласно его предпочтениям и приложение опять таки будет об этом знать.

Альтернативно передаче путей через -D можно сгенерировать config.h.

slovazap ★★★★★
()
Ответ на: комментарий от Jetty

/usr/lib/application_name/plugins/

поддерживаю этого человека.

bhfq ★★★★★
()

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

  • строка define, задающаяся при сборке
  • переменная среды
  • полный путь к проге
  • профиль программы у юзера

это работает везде, на 110%.

anonymous2 ★★★★★
()

Относительный путь от основной библиотеки до расположения плагинов должен быть фиксирован. По нему и загружать.

annulen ★★★★★
()
Ответ на: комментарий от annulen

А вот а счёт пути от приложения есть варианты. Как тут уже говорили в линуксах плагинам следует жить где-то в либдире, в винде где-то вместе с приложением. А вообще мне просто очень-очень не хочется зашивать в код макросы с путями, зависящими от условий сборки, если уж совсем честно. Думал как-нибудь выкрутиться.

KblCb ★★★★★
() автор топика
Ответ на: комментарий от KblCb

Как тут уже говорили в линуксах плагинам следует жить где-то в либдире, в винде где-то вместе с приложением.

ifdef. Для мака путь тоже другой будет.

annulen ★★★★★
()
Ответ на: комментарий от annulen

Я пока думаю как слепить макросы в коде и определения в pro-файле qmake'а. Хотя вероятно уже пора как большому переходить на cmake.

KblCb ★★★★★
() автор топика
Ответ на: комментарий от KblCb

Я пока думаю как слепить макросы в коде и определения в pro-файле qmake'а.

А что там лепить-то? ифдефишь в коде строковую константу с относительным путем на Q_OS_UNIX, Q_OS_WIN и Q_OS_MAC, затем подсовываешь этот путь QPluginLoader

Хотя вероятно уже пора как большому переходить на cmake.

Логика примерно такая же как в «Уже пора как большому начинать жрать водку». Пусть и гадость, но все большие так делают.

annulen ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.