动态链接器
Base.Libc.Libdl.dlopen — 函数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 的按位或。如果可能,这些将转换为 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_e — 函数dlopen_e(libfile::AbstractString [, flags::Integer])类似于 dlopen,但返回 C_NULL 而不是引发错误。此方法现在已弃用,建议使用 dlopen(libfile::AbstractString [, flags::Integer]; throw_error=false)。
Base.Libc.Libdl.RTLD_NOW — 常量RTLD_DEEPBIND
RTLD_FIRST
RTLD_GLOBAL
RTLD_LAZY
RTLD_LOCAL
RTLD_NODELETE
RTLD_NOLOAD
RTLD_NOW用于 dlopen 的枚举常量。如果适用,请参阅您的平台手册页以获取详细信息。
Base.Libc.Libdl.dlsym — 函数dlsym(handle, sym; throw_error::Bool = true)从共享库句柄中查找符号,成功时返回可调用的函数指针。
如果找不到符号,此方法将抛出错误,除非关键字参数 throw_error 设置为 false,在这种情况下,此方法将返回 nothing。
Base.Libc.Libdl.dlsym_e — 函数dlsym_e(handle, sym)从共享库句柄中查找符号,在查找失败时静默返回 C_NULL。此方法现在已弃用,建议使用 dlsym(handle, sym; throw_error=false)。
Base.Libc.Libdl.dlclose — 函数dlclose(handle)关闭句柄引用的共享库。
dlclose(::Nothing)对于非常常见的模式使用模式
try
hdl = dlopen(library_name)
... do something
finally
dlclose(hdl)
end我们定义了一个接受 Nothing 类型参数的 dlclose() 方法,以便用户代码不必为未找到 library_name 的情况更改其行为。
Base.Libc.Libdl.dlext — 常量dlext当前平台上动态库的文件扩展名(例如 dll、dylib、so)。
Base.Libc.Libdl.dllist — 函数dllist()返回当前加载的动态库的路径,以 Vector{String} 的形式。
Base.Libc.Libdl.dlpath — 函数dlpath(handle::Ptr{Cvoid})给定来自 dlopen 的库 handle,返回完整路径。
dlpath(libname::Union{AbstractString, Symbol})获取库 libname 的完整路径。
示例
julia> dlpath("libjulia")Base.Libc.Libdl.find_library — 函数find_library(names [, locations])在 locations 列表、DL_LOAD_PATH 或系统库路径(按此顺序)中的路径中搜索 names 中的第一个库,这些路径可以成功地进行 dlopen。成功时,返回值将是名称之一(可能以 locations 中的路径之一作为前缀)。此字符串可以分配给 global const 并用作将来 ccall 中的库名称。失败时,它返回空字符串。
Base.DL_LOAD_PATH — 常量DL_LOAD_PATH调用 dlopen 时,将首先按顺序搜索此列表中的路径,然后搜索系统位置以获取有效的库句柄。