Динамический компоновщик
#
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) ... do something 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
. При сбое возвращает пустую строку.