LibdlModule

Julia'daki Libdl modülü, paylaşılan kütüphanelerle dinamik bağlantı için özel ve daha düşük seviyeli olanaklar sağlar. Julia, ccall içsel işlevi aracılığıyla çalışma zamanı paylaşılan kütüphanelerine bağlantıyı doğal olarak desteklese de, Libdl bu yeteneği daha fazla, daha ayrıntılı kontrol sunarak genişletir. Kullanıcılara hem bellek hem de dosya sisteminde paylaşılan kütüphaneleri arama, belirli çalışma zamanı bağlayıcı seçenekleriyle manuel olarak yükleme ve kütüphane sembollerini düşük seviyeli işaretçiler olarak arama imkanı tanır.

source

Dynamic Linker

Base.Libc.Libdl.dlopenFunction
dlopen(libfile::AbstractString [, flags::Integer]; throw_error:Bool = true)

Paylaşılan bir kütüphaneyi yükler ve opak bir handle döner.

Sabit dlext tarafından verilen uzantı (.so, .dll veya .dylib)libfiledizesinden çıkarılabilir, çünkü gerekirse otomatik olarak eklenir. Eğerlibfilemutlak bir yol adı değilse,libfileiçinDLLOADPATH` dizisindeki yollar aranır, ardından sistem yükleme yolu kontrol edilir.

İsteğe bağlı bayrak argümanı, sıfır veya daha fazla RTLD_LOCAL, RTLD_GLOBAL, RTLD_LAZY, RTLD_NOW, RTLD_NODELETE, RTLD_NOLOAD, RTLD_DEEPBIND ve RTLD_FIRST bayrağının bit düzeyinde veya işlemidir. Bunlar, mümkünse POSIX (ve/veya GNU libc ve/veya MacOS) dlopen komutunun karşılık gelen bayraklarına dönüştürülür veya belirtilen işlevsellik mevcut platformda mevcut değilse göz ardı edilir. Varsayılan bayraklar platforma özgüdür. MacOS'ta varsayılan dlopen bayrakları RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL iken, diğer platformlarda varsayılanlar RTLD_LAZY|RTLD_DEEPBIND|RTLD_LOCAL'dır. Bu bayrakların önemli bir kullanımı, dinamik kütüphane yükleyicisinin kütüphane referanslarını dışa aktarılan sembollere bağladığında ve bağlı referansların işlem yerel veya küresel kapsamda olup olmadığını belirtmektir. Örneğin, RTLD_LAZY|RTLD_DEEPBIND|RTLD_GLOBAL, kütüphanenin sembollerinin diğer paylaşılan kütüphanelerde kullanılabilir olmasını sağlar ve paylaşılan kütüphaneler arasında bağımlılıkların olduğu durumları ele alır.

Eğer kütüphane bulunamazsa, bu yöntem bir hata fırlatır, throw_error anahtar kelime argümanı false olarak ayarlanmadıkça, bu durumda bu yöntem nothing döner.

Note

Julia 1.6'dan itibaren, bu yöntem @executable_path/ ile başlayan yolları Julia yürütülebilir dosyasının yolu ile değiştirir ve taşınabilir göreli yol yüklemelerine olanak tanır. Julia 1.5 ve öncesinde, bu yalnızca macOS'ta çalışıyordu.

source
Base.Libc.Libdl.dlopen_eFunction
dlopen_e(libfile::AbstractString [, flags::Integer])

dlopen ile benzer, ancak hataları yükseltmek yerine C_NULL döner. Bu yöntem artık dlopen(libfile::AbstractString [, flags::Integer]; throw_error=false) lehine kullanımdan kaldırılmıştır.

source
Base.Libc.Libdl.RTLD_NOWConstant
RTLD_DEEPBIND
RTLD_FIRST
RTLD_GLOBAL
RTLD_LAZY
RTLD_LOCAL
RTLD_NODELETE
RTLD_NOLOAD
RTLD_NOW

dlopen için enum sabiti. Geçerliyse, platformunuzun man sayfasına bakın.

source
Base.Libc.Libdl.dlsymFunction
dlsym(handle, sym; throw_error::Bool = true)

Paylaşılan bir kütüphane tutamacından bir sembol arayın, başarılı olursa çağrılabilir işlev işaretçisi döndürün.

Sembol bulunamazsa, bu yöntem bir hata fırlatır, throw_error anahtar kelime argümanı false olarak ayarlanmadığı sürece; bu durumda bu yöntem nothing döndürür.

source
Base.Libc.Libdl.dlsym_eFunction
dlsym_e(handle, sym)

Paylaşılan bir kütüphane tutamacından bir sembol arayın, arama başarısız olursa sessizce C_NULL döndürün. Bu yöntem artık dlsym(handle, sym; throw_error=false) lehine kullanımdan kaldırılmıştır.

source
Base.Libc.Libdl.dlcloseFunction
dlclose(handle)

Handle ile referans verilen paylaşılan kütüphaneyi kapatır.

source
dlclose(::Nothing)

Çok yaygın bir kullanım deseni için

try
    hdl = dlopen(library_name)
    ... bir şey yap
finally
    dlclose(hdl)
end

Kullanıcı kodunun library_name bulunamadığında davranışını değiştirmesi gerekmemesi için, Nothing türünde bir parametre kabul eden bir dlclose() yöntemi tanımlıyoruz.

source
Base.Libc.Libdl.dllistFunction
dllist()

Şu anda yüklü olan dinamik kütüphanelerin yollarını Vector{String} içinde döndürür.

source
Base.Libc.Libdl.dlpathFunction
dlpath(handle::Ptr{Cvoid})

dlopen ile alınan bir kütüphane handle'dan tam yolu döndürür.

source
dlpath(libname::Union{AbstractString, Symbol})

libname kütüphanesinin tam yolunu alır.

Örnekler

julia> dlpath("libjulia")
source
Base.Libc.Libdl.find_libraryFunction
find_library(names [, locations])

names listesindeki ilk kütüphaneyi, locations listesindeki yolları, DL_LOAD_PATH veya sistem kütüphane yollarını (bu sırayla) kullanarak arar ve başarılı bir şekilde dlopen'lanabilir. Başarılı olursa, dönen değer, isimlerden biri (potansiyel olarak locations'daki yolların biriyle ön eklenmiş) olacaktır. Bu dize, gelecekteki ccall'lerde kütüphane adı olarak kullanılmak üzere bir global const'a atanabilir. Başarısız olursa, boş dize döner.

source
Base.DL_LOAD_PATHConstant
DL_LOAD_PATH

dlopen çağrıldığında, bu listedeki yollar öncelikle, sırayla, geçerli bir kütüphane tutucu için sistem konumlarını aramadan önce aranacaktır.

source