dlopen () с зависимостями между библиотеками - PullRequest
3 голосов
/ 22 марта 2012

Моя программа использует плагины, которые загружаются динамически с помощью dlopen ().Расположение этих плагинов может быть произвольным, поэтому они не обязательно находятся в пути к библиотеке.В некоторых случаях один плагин должен зависеть от другого плагина.Поэтому, если A и B являются динамическими библиотеками, я сначала загружу A, а затем загрузлю B, который использует символы, определенные в A.

Мое чтение документации dlopen () подразумевает, что если я укажу RTLD_GLOBAL, все это должно работать,Но это не так.Когда я вызываю dlopen () для второй библиотеки, она завершается ошибкой, сообщая, что не может найти первую (которая уже была загружена с помощью dlopen ()):

Error loading library /usr/local/openmm/lib/plugins/libOpenMMRPMDOpenCL.dylib: dlopen(/usr/local/openmm/lib/plugins/libOpenMMRPMDOpenCL.dylib, 9): Library not loaded: libOpenMMOpenCL.dylib
Referenced from: /usr/local/openmm/lib/plugins/libOpenMMRPMDOpenCL.dylib
Reason: image not found

Как мне сделатьэто работа?

1 Ответ

1 голос
/ 29 ноября 2012

См. Этот ответ здесь: Изображение ошибки dlopen () не найдено

Если вы измените библиотеку, указав имя для установки @ rpath / blah.dylib, вы сможетечтобы сделать это.

Редактировать:

Я также использую cmake, используйте это:

set_target_properties(${MY_LIB} PROPERTIES BUILD_WITH_INSTALL_RPATH 1 INSTALL_NAME_DIR "@rpath")

Это не ломает вещи на других платформах, но делаетуверен, что вы не вызвали CMAKE_SKIP_RPATH или он не будет вызван.

...