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_errorfalse の場合は nothing を返します。

Libdl.dlopen_e ── 関数

dlopen_e(libfile::AbstractString [, flags::Integer])

基本的に dlopen と同様ですが、エラーが起きたときにエラーを送出するのではなく C_NULL を返します。dlopen(libfile::AbstractString [, flags::Integer]; throw_error=false) があるので、現在このメソッドは非推奨です。

Libdl.RTLD_NOW ── 定数

RTLD_DEEPBIND
RTLD_FIRST
RTLD_GLOBAL
RTLD_LAZY
RTLD_LOCAL
RTLD_NODELETE
RTLD_NOLOAD
RTLD_NOW

dlopen に対するフラグを表す列挙体です。詳細はプラットフォームのマニュアルを参照してください。

Libdl.dlsym ── 関数

dlsym(hnd::Ptr, s::Union{Symbol,AbstractString}; throw_error::Bool = true)

共有ライブラリハンドルからシンボルを検索します2。成功すると呼び出しが可能な関数ポインタが返ります。

Libdl.dlsym_e ── 関数

dlsym_e(handle, sym)

共有ライブラリハンドルからシンボルを検索します。失敗するとエラーを送出せずに C_NULL を返します。dlsym(handle, sym; throw_error=false) があるので、現在このメソッドは非推奨です。

Libdl.dlclose ── 関数

dlclose(handle)

ハンドルが参照する共有ライブラリを閉じます。

dlclose(::Nothing)

このメソッドは非常によく使われる次のパターンのために定義されます:

try
    hdl = dlopen(library_name)
    ... 処理を行う
finally
    dlclose(hdl)
end

Nothing 型のパラメータを受け取る dlclose() を定義しておけば、ユーザーは library_name が見つかったかどうかに応じて処理を切り替える必要がなくなります。

Libdl.dlext ── 定数

dlext

現在のプラットフォームで使われる動的ライブラリファイルの拡張子です (dll, dylib など)。

Libdl.dllist ── 関数

dllist()

現在読み込まれている動的ライブラリのパスを Vector{String} 型の値として返します。

Libdl.dlpath ── 関数

dlpath(handle::Ptr{Cvoid})

dlopen が返すハンドル handle を受け取り、その完全パスを返します。

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 でライブラリ名として利用できます。検索が失敗すると空文字列が返ります。

Base.DL_LOAD_PATH ── 定数

DL_LOAD_PATH

dlopen でライブラリを検索するとき、システムのライブラリパスの前にこのリスト内のパスが最初に検索されます。


  1. 訳注: dlopen の返り値が "不透明" (opaque) とは、他の関数に渡すことでしか利用できないということ。[return]

  2. 訳注: 英語版の関数プロトタイプを修正した。[return]

広告