動態連結器
Base.Libc.Libdl.dlopen
— 函式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_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
時,會先依序搜尋此清單中的路徑,然後再搜尋系統位置,以尋找有效的函式庫句柄。