POSIX не поддерживает механизм для поиска каталогов в пути поиска совместно используемой библиотеки (например, он не требует LD_LIBRARY_PATH
), поэтому любое решение по своей природе в некоторой степени зависит от платформы.
В Linux возникают некоторые проблемы, поскольку используемые значения могут основываться на содержимом /etc/ld.so.conf
, а также на любых значениях времени выполнения в LD_LIBRARY_PATH
переменной среды; другие системы представляют сопоставимые проблемы. Расположение по умолчанию также различается в зависимости от системы - с /lib
и /usr/lib
обычно для 32-битных машин Linux, но /lib64
и /usr/lib64
используются по крайней мере на некоторых 64-битных машинах. Однако другие платформы используют другие места для 64-битного программного обеспечения. Например, Solaris, например, использует /lib/sparcv9
и /usr/lib/sparcv9
(хотя в документах упоминаются /lib/64
и /usr/lib/64
, они являются символическими ссылками на каталоги sparcv9
). В Solaris также есть переменные окружения LD_LIBRARY_PATH_64
и LD_LIBRARY_PATH_32
. HP-UX и AIX традиционно используют другие переменные, кроме LD_LIBRARY_PATH
- SHLIB_PATH
и LIBPATH
, IIRC - хотя я считаю, что AIX теперь также использует LD_LIBRARY_PATH
. А в Solaris инструментом для настройки общих библиотек является «crle» (настройка среды связывания во время выполнения), а аналогом /etc/ld.so.conf
является /var/ld/ld.config
или /var/ld/64/ld.config
. Также, конечно, расширения в общих библиотеках могут быть разными (.so
, .sl
, .dylib
, .bundle
и т. Д.).
Итак, ваше решение будет зависеть от платформы. Вам нужно будет выбрать расположение по умолчанию, переменные среды для чтения и файл конфигурации для чтения, а также соответствующее расширение файла. Учитывая это, то это в основном SMOP - простой вопрос программирования:
- Для каждого каталога, названного любым из источников:
- Открыть соответствующий подкаталог (
opendir()
)
- Прочитать каждое имя файла (
readdir()
) по очереди
- Используйте
dlopen()
в пути к соответствующим файлам.
- Делайте любой анализ, который вам подходит.
- Использование
dlclose()
- Использование
closedir()
См. Также примечания в комментариях ниже ... вся тема скромно таит в себе различия от платформы к платформе.