#
Libdl
— Module
Модуль Libdl в Julia предоставляет специализированные и низкоуровневые средства для динамической компоновки с общими библиотеками. Хотя в Julia изначально поддерживается компоновка с общими библиотеками времени выполнения через встроенный вызов ccall
, модуль Libdl
расширяет эту возможность, предлагая дополнительный, более детальный контроль. Он позволяет пользователям искать общие библиотеки как в памяти, так и в файловой системе, вручную загружать их с определенными параметрами компоновщика времени выполнения и искать символы библиотек как низкоуровневые указатели.
Dynamic Linker
#
Base.Libc.Libdl.dlopen
— Function
dlopen(libfile::AbstractString [, flags::Integer]; throw_error:Bool = true)
Загружает общую библиотеку, возвращая непрозрачный дескриптор.
Расширение, задаваемое константой dlext
(.so
, .dll
или .dylib
), можно опускать из строки libfile
, так как оно автоматически добавляется при необходимости. Если libfile
не является именем абсолютного пути, то по путям в массиве DL_LOAD_PATH
выполняется поиск libfile
, а затем поиск по путям загрузки системы.
Аргументы необязательных флагов — это побитовое ИЛИ нуля или более флагов RTLD_LOCAL
, RTLD_GLOBAL
, RTLD_LAZY
, RTLD_NOW
, RTLD_NODELETE
, RTLD_NOLOAD
, RTLD_DEEPBIND
и RTLD_FIRST
. Они преобразуются в соответствующие флаги команды POSIX (и (или) GNU libc и (или) MacOS) Dlopen, если это возможно, или игнорируются, если указанная функциональность недоступна на текущей платформе. Флаги по умолчанию зависят от платформы. В MacOS флаги dlopen
по умолчанию — RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL
, а на других платформах флаги по умолчанию — RTLD_LAZY|RTLD_DEEPBIND|RTLD_LOCAL
. Важным способом использования этих флагов является указание поведения не по умолчанию, когда средство загрузки динамической библиотеки связывает ссылки на библиотеку с экспортированными символами и если связанные ссылки помещаются в процесс местной или глобальной области. Например, RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL
разрешает символам библиотеки быть доступными для использования в других общих библиотеках, реагируя на ситуации, в которых имеются зависимости между общими библиотеками.
Если библиотеку невозможно найти, этот метод выдает ошибку, кроме тех случаев, когда для именованного аргумента throw_error
задано значение false
. В этом случае этот метод возвращает nothing
.
Начиная с версии Julia 1.6 этот метод заменяет пути, начинающиеся с |
#
Base.Libc.Libdl.dlopen_e
— Function
dlopen_e(libfile::AbstractString [, flags::Integer])
Аналогично функции dlopen
, за исключением того, что возвращается C_NULL
, а не выдаются ошибки. Этот метод теперь является устаревшим, вместо него следует использовать dlopen(libfile::AbstractString [, flags::Integer]; throw_error=false)
.
#
Base.Libc.Libdl.dlsym
— Function
dlsym(handle, sym; throw_error::Bool = true)
Ищет символ из дескриптора общей библиотеки, возвращая указатель вызываемой функции в случае успеха.
Если символ невозможно найти, этот метод выдает ошибку, кроме тех случаев, когда для именованного аргумента throw_error
задано значение false
. В этом случае этот метод возвращает nothing
.
#
Base.Libc.Libdl.dlsym_e
— Function
dlsym_e(handle, sym)
Ищет символ из дескриптора общей библиотеки, автоматически возвращая C_NULL
при сбое поиска. Этот метод теперь является устаревшим, вместо него следует использовать dlsym(handle, sym; throw_error=false)
.
#
Base.Libc.Libdl.dlclose
— Function
dlclose(handle)
Закрывает общую библиотеку, на которую ссылается дескриптор.
dlclose(::Nothing)
Для очень распространенного шаблона использования:
try hdl = dlopen(library_name) ... выполняем действия finally dlclose(hdl) end
мы определяем метод dlclose()
, который принимает параметр типа Nothing
, чтобы этому пользовательскому коду не нужно было изменять свое поведение в случае, если имя библиотеки (library_name
) не было найдено.
#
Base.Libc.Libdl.dlext
— Constant
dlext
Расширение файла для динамических библиотек (например, dll, dylib, so) на текущей платформе.
#
Base.Libc.Libdl.dllist
— Function
dllist()
Возвращает пути динамических библиотек, в настоящий момент загруженных в Vector{String}
.
#
Base.Libc.Libdl.dlpath
— Function
dlpath(handle::Ptr{Cvoid})
Для заданного дескриптора (handle
) библиотеки из dlopen
возвращает полный путь.
dlpath(libname::Union{AbstractString, Symbol})
Возвращает полный путь библиотеки libname
.
Примеры
julia> dlpath("libjulia")
#
Base.Libc.Libdl.find_library
— Function
find_library(names [, locations])
Ищет первую библиотеку в именах (names
) в путях из списка расположений locations
, DL_LOAD_PATH
или путях к системным библиотекам (в этом порядке), для которых можно успешно выполнить команду dlopen. При успешном выполнении возвращаемым значением будет одно из имен (к которому можно добавлять в виде префикса один из путей в расположениях). Строку можно присвоить global const
и использовать в качестве имени библиотеки в будущих ccall
. При сбое возвращает пустую строку.