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