Документация Engee

Динамический компоновщик

# Base.Libc.Libdl.dlopenFunction

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 этот метод заменяет пути, начинающиеся с @executable_path/, путем к исполняемому файлу Julia, что обеспечивает загрузки по относительному пути с возможностью перемещения. В Julia 1.5 и более ранних версиях это работало только в macOS.

# Base.Libc.Libdl.dlopen_eFunction

dlopen_e(libfile::AbstractString [, flags::Integer])

Аналогичен функции dlopen, за исключением того, что возвращает C_NULL, а не выдает ошибки. Этот метод теперь является устаревшим, вместо него следует использовать dlopen(libfile::AbstractString [, flags::Integer]; throw_error=false).

# Base.Libc.Libdl.RTLD_NOWConstant

RTLD_DEEPBIND
RTLD_FIRST
RTLD_GLOBAL
RTLD_LAZY
RTLD_LOCAL
RTLD_NODELETE
RTLD_NOLOAD
RTLD_NOW

Константа перечисления dlopen. Подробные сведения см. на главной странице, если применимо.

# Base.Libc.Libdl.dlsymFunction

dlsym(handle, sym; throw_error::Bool = true)

Ищет символ из дескриптора общей библиотеки, возвращает указатель вызываемой функции в случае успеха.

Если символ невозможно найти, этот метод выдает ошибку, кроме тех случаев, когда для именованного аргумента throw_error задано значение false. В этом случае этот метод возвращает nothing.

# Base.Libc.Libdl.dlsym_eFunction

dlsym_e(handle, sym)

Ищет символ из дескриптора общей библиотеки, автоматически возвращает C_NULL при сбое поиска. Этот метод теперь является устаревшим, вместо него следует использовать dlsym(handle, sym; throw_error=false).

# Base.Libc.Libdl.dlcloseFunction

dlclose(handle)

Закрывает общую библиотеку, на которую ссылается дескриптор.

dlclose(::Nothing)

Для очень распространенного шаблона шаблон использования:

try
    hdl = dlopen(library_name)
    ... do something
finally
    dlclose(hdl)
end

Мы определяем метод dlclose(), который принимает параметр типа Nothing, чтобы этому пользовательскому коду не нужно было изменять свое поведение в случае, если имя библиотеки (library_name) не было найдено.

# Base.Libc.Libdl.dlextConstant

dlext

Расширение файла для динамических библиотек (например, dll, dylib, so) на текущей платформе.

# Base.Libc.Libdl.dllistFunction

dllist()

Возвращает пути динамических библиотек, в настоящий момент загруженных в Vector{String}.

# Base.Libc.Libdl.dlpathFunction

dlpath(handle::Ptr{Cvoid})

При наличии дескриптора (handle) библиотеки из dlopen возвращает полный путь.

dlpath(libname::Union{AbstractString, Symbol})

Получает полный путь библиотеки libname.

Пример

julia> dlpath("libjulia")

# Base.Libc.Libdl.find_libraryFunction

find_library(names, locations)

Ищет первую библиотеку в именах (names) в путях из списка расположений (locations), DL_LOAD_PATH, или пути к системной библиотеке (в этом порядке), для которых можно успешно выполнить команду dlopen. При успешном выполнении возвращаемым значением будет одно из имен (к которому можно добавлять в виде префикса один из путей в расположениях). Строку можно назначать global const и использовать в качестве имени библиотеки в будущих ccall. При сбое возвращает пустую строку.

# Base.DL_LOAD_PATHConstant

DL_LOAD_PATH

При вызове dlopen в первую очередь поиск будет выполняться по путям в этом списке по порядку, прежде чем выполнять поиск допустимого обработчика библиотеки в системных расположениях.