Libdl
— ModuleМодуль Libdl в Julia предоставляет специализированные и более низкоуровневые средства для динамической компоновки с общими библиотеками. Хотя Julia по умолчанию поддерживает компоновку с общими библиотеками времени выполнения через встроенную функцию ccall
, Libdl
расширяет эту возможность, предлагая дополнительный, более детализированный контроль. Он позволяет пользователям искать общие библиотеки как в памяти, так и в файловой системе, вручную загружать их с конкретными параметрами компоновщика времени выполнения и искать символы библиотеки в виде низкоуровневых указателей.
Dynamic Linker
Base.Libc.Libdl.dlopen
— Functiondlopen(libfile::AbstractString [, flags::Integer]; throw_error:Bool = true)
Загрузите общую библиотеку, возвращая непрозрачный дескриптор.
Расширение, заданное константой dlext
(.so
, .dll
или .dylib
), можно опустить из строки libfile
, так как оно автоматически добавляется при необходимости. Если libfile
не является абсолютным именем пути, то пути в массиве DL_LOAD_PATH
ищутся для libfile
, за которыми следует системный путь загрузки.
Необязательный аргумент flags является побитовой операцией "или" нуля или более из RTLD_LOCAL
, RTLD_GLOBAL
, RTLD_LAZY
, RTLD_NOW
, RTLD_NODELETE
, RTLD_NOLOAD
, RTLD_DEEPBIND
и RTLD_FIRST
. Эти флаги преобразуются в соответствующие флаги команды dlopen POSIX (и/или GNU libc и/или MacOS), если это возможно, или игнорируются, если указанная функциональность недоступна на текущей платформе. Значения по умолчанию зависят от платформы. На 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, этот метод заменяет пути, начинающиеся с @executable_path/
, на путь к исполняемому файлу Julia, что позволяет загружать относительные пути, которые можно перемещать. В Julia 1.5 и ранее это работало только на macOS.
Base.Libc.Libdl.dlopen_e
— Functiondlopen_e(libfile::AbstractString [, flags::Integer])
Похоже на dlopen
, за исключением того, что возвращает C_NULL
вместо того, чтобы вызывать ошибки. Этот метод теперь устарел в пользу dlopen(libfile::AbstractString [, flags::Integer]; throw_error=false)
.
Base.Libc.Libdl.RTLD_NOW
— ConstantRTLD_DEEPBIND
RTLD_FIRST
RTLD_GLOBAL
RTLD_LAZY
RTLD_LOCAL
RTLD_NODELETE
RTLD_NOLOAD
RTLD_NOW
Константа перечисления для dlopen
. См. страницу руководства вашей платформы для получения подробной информации, если это применимо.
Base.Libc.Libdl.dlsym
— Functiondlsym(handle, sym; throw_error::Bool = true)
Ищет символ в дескрипторе общей библиотеки, возвращает указатель на вызываемую функцию при успехе.
Если символ не может быть найден, этот метод вызывает ошибку, если аргумент ключевого слова throw_error
не установлен в false
, в этом случае этот метод возвращает nothing
.
Base.Libc.Libdl.dlsym_e
— Functiondlsym_e(handle, sym)
Ищет символ в дескрипторе общей библиотеки, без уведомления возвращает C_NULL
в случае неудачи. Этот метод теперь устарел в пользу dlsym(handle, sym; throw_error=false)
.
Base.Libc.Libdl.dlclose
— Functiondlclose(handle)
Закрыть общую библиотеку, на которую ссылается handle.
dlclose(::Ничто)
Для очень распространенного шаблона использования
try
hdl = dlopen(library_name)
... do something
finally
dlclose(hdl)
end
Мы определяем метод dlclose()
, который принимает параметр типа Ничто
, чтобы код пользователя не должен был изменять свое поведение в случае, если library_name
не был найден.
Base.Libc.Libdl.dlext
— Constantdlext
Файл расширения для динамических библиотек (например, dll, dylib, so) на текущей платформе.
Base.Libc.Libdl.dllist
— Functiondllist()
Возвращает пути динамических библиотек, которые в настоящее время загружены в Vector{String}
.
Base.Libc.Libdl.dlpath
— Functiondlpath(handle::Ptr{Cvoid})
Данная библиотека handle
из dlopen
возвращает полный путь.
dlpath(libname::Union{AbstractString, Symbol})
Получите полный путь к библиотеке libname
.
Примеры
julia> dlpath("libjulia")
Base.Libc.Libdl.find_library
— Functionfind_library(names [, locations])
Ищет первую библиотеку в names
в путях из списка locations
, DL_LOAD_PATH
или системных путях библиотек (в этом порядке), которую можно успешно загрузить с помощью dlopen. В случае успеха возвращаемое значение будет одним из имен (возможно, с префиксом одного из путей в locations). Эта строка может быть присвоена global const
и использована в качестве имени библиотеки в будущих ccall
. В случае неудачи возвращает пустую строку.
Base.DL_LOAD_PATH
— ConstantDL_LOAD_PATH
При вызове dlopen
пути в этом списке будут сначала искаться в указанном порядке, прежде чем искать в системных местах для получения действительной библиотеки.