Libdl
Libdl.dlopen
── 関数
dlopen(libfile::AbstractString [, flags::Integer]; throw_error:Bool = true)
共有ライブラリを読み込み、不透明1なハンドルを返します。
定数 Libdl.dlext
が与える拡張子 (.so
, .dll
, .dylib
のいずれか) は dlopen
の文字列引数 libfile
から省略でき、省略すると自動で付け足されます。libfile
が絶対パスでないときは、システムのロードパスおよび配列 DL_LOAD_PATH
にあるパスで libfile
が検索されます。
省略可能な引数 flag
には RTLD_LOCAL
, RTLD_GLOBAL
, RTLD_LAZY
, RTLD_NOW
, RTLD_NODELETE
, RTLD_NOLOAD
, RTLD_DEEPBIND
, RTLD_FIRST
をビット単位の OR でゼロ個以上繫いだものを指定できます。このフラグは POSIX (および GNU libc や MacOS) の dlopen
の対応するフラグに変換されますが、現在のプラットフォームで利用できない機能を指定したときは無視されます。
デフォルトの flags
はプラットフォームごとに異なります。dlopen
が使うデフォルトの flags
は MacOS では RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL
であり、その他のプラットフォームでは RTLD_LAZY|RTLD_DEEPBIND|RTLD_LOCAL
です。このフラグの重要な利用法が、動的ライブラリローダーがライブラリの参照をエクスポートされたシンボルにバインドするときの振る舞いの切り替えと、バインドされる参照をプロセスローカルスコープとグローバルスコープのどちらに入れるかの指定です。例えば RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL
とすればライブラリのシンボルは他の共有ライブラリから利用できるようになるので、共有ライブラリ間に依存関係がある状況で役立ちます。
指定されたライブラリが見つからないと、このメソッドはエラーを送出します。ただしキーワード引数 throw_error
が false
の場合は nothing
を返します。
Libdl.dlopen_e
── 関数
Libdl.RTLD_NOW
── 定数
Libdl.dlsym
── 関数
Libdl.dlsym_e
── 関数
dlsym_e(handle, sym)
共有ライブラリハンドルからシンボルを検索します。失敗するとエラーを送出せずに C_NULL
を返します。dlsym(handle, sym; throw_error=false)
があるので、現在このメソッドは非推奨です。
Libdl.dlclose
── 関数
dlclose(::Nothing)
このメソッドは非常によく使われる次のパターンのために定義されます:
try
hdl = dlopen(library_name)
... 処理を行う
finally
dlclose(hdl)
end
Nothing
型のパラメータを受け取る dlclose()
を定義しておけば、ユーザーは library_name
が見つかったかどうかに応じて処理を切り替える必要がなくなります。
Libdl.dlext
── 定数
Libdl.dllist
── 関数
Libdl.dlpath
── 関数
dlpath(libname::Union{AbstractString, Symbol})
ライブラリ libname
の完全パスを取得します。
例
julia> dlpath("libjulia")
Libdl.find_library
── 関数
find_library(names, locations)
names
に含まれるライブラリの名前を順に検索し、最初に見つかったライブラリの名前を返します。検索はリスト locations
にあるパス・DL_LOAD_PATH
・システムライブラリパスの順に行われ、dlopen
に成功したパスが見つかったものとみなされます。検索に成功するとリストにある名前が返りますが、そのとき locations
にあるパスが先頭に付く場合もあります。この文字列を global const
に代入すれば、以降の ccall
でライブラリ名として利用できます。検索が失敗すると空文字列が返ります。