LibdlModule

Модуль Libdl в Julia предоставляет специализированные и более низкоуровневые средства для динамической компоновки с общими библиотеками. Хотя Julia по умолчанию поддерживает компоновку с общими библиотеками времени выполнения через встроенную функцию ccall, Libdl расширяет эту возможность, предлагая дополнительный, более детализированный контроль. Он позволяет пользователям искать общие библиотеки как в памяти, так и в файловой системе, вручную загружать их с конкретными параметрами компоновщика времени выполнения и искать символы библиотеки в виде низкоуровневых указателей.

source

Dynamic Linker

Base.Libc.Libdl.dlopenFunction
dlopen(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.

Note

Начиная с Julia 1.6, этот метод заменяет пути, начинающиеся с @executable_path/, на путь к исполняемому файлу Julia, что позволяет загружать относительные пути, которые можно перемещать. В Julia 1.5 и ранее это работало только на macOS.

source
Base.Libc.Libdl.dlopen_eFunction
dlopen_e(libfile::AbstractString [, flags::Integer])

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

source
Base.Libc.Libdl.RTLD_NOWConstant
RTLD_DEEPBIND
RTLD_FIRST
RTLD_GLOBAL
RTLD_LAZY
RTLD_LOCAL
RTLD_NODELETE
RTLD_NOLOAD
RTLD_NOW

Константа перечисления для dlopen. См. страницу руководства вашей платформы для получения подробной информации, если это применимо.

source
Base.Libc.Libdl.dlsymFunction
dlsym(handle, sym; throw_error::Bool = true)

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

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

source
Base.Libc.Libdl.dlsym_eFunction
dlsym_e(handle, sym)

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

source
Base.Libc.Libdl.dlcloseFunction
dlclose(handle)

Закрыть общую библиотеку, на которую ссылается handle.

source
dlclose(::Ничто)

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

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

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

source
Base.Libc.Libdl.dlextConstant
dlext

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

source
Base.Libc.Libdl.dllistFunction
dllist()

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

source
Base.Libc.Libdl.dlpathFunction
dlpath(handle::Ptr{Cvoid})

Данная библиотека handle из dlopen возвращает полный путь.

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

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

Примеры

julia> dlpath("libjulia")
source
Base.Libc.Libdl.find_libraryFunction
find_library(names [, locations])

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

source
Base.DL_LOAD_PATHConstant
DL_LOAD_PATH

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

source