2012-03-22 3 views
3

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

Мое чтение документации 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

Как выглядит 'ldd' в обеих библиотеках? – sarnold

+0

Вы связали основную программу и каждую общую библиотеку с '-rdynamic'? –

+0

Я думаю, что -rdynamic указывается, хотя я не уверен - я строю с CMake, у которого есть свой собственный набор возможностей для создания библиотек. В любом случае, я не думаю, что это проблема. Ошибка не жалуется на недостающие символы, а скорее не на то, чтобы найти библиотеку. И да, ldd (или otool на Mac) сообщает эту библиотеку как зависимость. Возможно, в этом и проблема. Есть ли способ сделать плагин специально не требующим этой библиотеки, но все же использовать символы, определенные в нем? – peastman

ответ

1

Смотрите этот ответ здесь: dlopen() error image not found

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

Edit:

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

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

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

Смежные вопросы