# *`Libdl的`*-模式_
Julia中的Libdl模块为与共享库的动态链接提供了专门的和较低级别的设施。 而Julia本质上支持通过 ccall 内在, Libdl的 通过提供额外的、更精细的控制来扩展此功能。 它使用户能够在内存和文件系统中搜索共享库,使用特定的运行时链接器选项手动加载它们,并将库符号作为低级指针查找。
动态链接器
# *`基地。Libc。的Libdl。德洛彭`*-函数
dlopen(libfile::AbstractString [, flags::Integer]; throw_error:Bool = true)
加载共享库,返回不透明句柄。
常数给出的扩展 德莱克斯特 (.所以, .dll,或 .迪利布)可从 lib文件 字符串,因为如果需要,它会自动附加。 如果 lib文件 不是绝对路径名,那么数组中的路径 DL_LOAD_PATH 被搜索 lib文件,其次是系统负载路径。
可选的标志参数是一个按位或零或多个 RTLD_本地, RTLD_全球, RTLD_LAZY, RTLD_NOW, RTLD_NODELETE, RTLD_NOLOAD, RTLD_DEEPBIND,而 RTLD_第一. 如果可能的话,它们会转换为POSIX(和/或GNU libc和/或MacOS)dlopen命令的相应标志,或者如果指定的功能在当前平台上不可用,则会被忽略。 默认标志是特定于平台的。 在MacOS上默认 德洛彭 旗帜是 RTLD_LAZY/RTLD_DEEPBIND/RTLD_GLOBAL 而在其他平台上,默认值是 RTLD_LAZY/RTLD_DEEPBIND/RTLD_LOCAL. 这些标志的一个重要用法是为动态库加载器将库引用绑定到导出的符号以及绑定的引用是否放入进程本地或全局范围指定非默认行为。 例如 RTLD_LAZY/RTLD_DEEPBIND/RTLD_GLOBAL 允许库的符号可用于其他共享库,解决共享库之间存在依赖关系的情况。
如果找不到库,此方法将引发错误,除非关键字参数 抛出错误 被设置为 错误,在这种情况下,此方法返回 什么都没有.
|
请注意,从Julia1.6开始,此方法将替换以 |
# *`基地。Libc。的Libdl。[医]dlsym`*-函数
dlsym(handle, sym; throw_error::Bool = true)
从共享库句柄中查找符号,成功时返回可调用函数指针。
如果找不到符号,此方法将引发错误,除非关键字参数 抛出错误 被设置为 错误,在这种情况下,此方法返回 什么都没有.
# *`基地。Libc。的Libdl。dlsym_e`*-函数
dlsym_e(handle, sym)
从共享库句柄中查找符号,默默返回 C_NULL 在查找失败。 此方法现在已被弃用,以支持 dlsym(handle,sym;throw_error=false).
# *`基地。Libc。的Libdl。[医]dlclose`*-函数
dlclose(::Nothing)
对于非常常见的模式使用模式
try
hdl = dlopen(library_name)
... do something
finally
dlclose(hdl)
end
我们定义一个 dlclose() 接受类型参数的方法 什么都没有,以便用户代码不必更改其行为的情况下, 图书馆名称 没有找到。
dlclose(handle)
关闭handle引用的共享库。
# *`基地。Libc。的Libdl。dlpath`*-函数
dlpath(libname::Union{AbstractString, Symbol})
获取库的完整路径 图书馆名称.
*例子*
julia> dlpath("libjulia")
dlpath(handle::Ptr{Cvoid})
给定一个库 手柄 从 德洛彭,返回完整路径。
# *`基地。Libc。的Libdl。find_图书馆`*-函数
find_library(names [, locations])
在 姓名 在路径中 地点 名单, DL_LOAD_PATH,或系统库路径(按该顺序),这些路径可以成功地被dlopen。成功后,返回值将是其中一个名称(可能以位置中的一个路径作为前缀)。 这个字符串可以分配给一个 全球const 并用作将来的库名 ccall在失败时,它返回空字符串。