Libdl — ModuleJulia'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.
Dynamic Linker
Base.Libc.Libdl.dlopen — Functiondlopen(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.
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.
Base.Libc.Libdl.dlopen_e — Functiondlopen_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.
Base.Libc.Libdl.RTLD_NOW — ConstantRTLD_DEEPBIND
RTLD_FIRST
RTLD_GLOBAL
RTLD_LAZY
RTLD_LOCAL
RTLD_NODELETE
RTLD_NOLOAD
RTLD_NOWdlopen için enum sabiti. Geçerliyse, platformunuzun man sayfasına bakın.
Base.Libc.Libdl.dlsym — Functiondlsym(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.
Base.Libc.Libdl.dlsym_e — Functiondlsym_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.
Base.Libc.Libdl.dlclose — Functiondlclose(handle)Handle ile referans verilen paylaşılan kütüphaneyi kapatır.
dlclose(::Nothing)Çok yaygın bir kullanım deseni için
try
hdl = dlopen(library_name)
... bir şey yap
finally
dlclose(hdl)
endKullanı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.
Base.Libc.Libdl.dlext — ConstantdlextMevcut platformda dinamik kütüphaneler için dosya uzantısı (örn. dll, dylib, so).
Base.Libc.Libdl.dllist — Functiondllist()Şu anda yüklü olan dinamik kütüphanelerin yollarını Vector{String} içinde döndürür.
Base.Libc.Libdl.dlpath — Functiondlpath(handle::Ptr{Cvoid})dlopen ile alınan bir kütüphane handle'dan tam yolu döndürür.
dlpath(libname::Union{AbstractString, Symbol})libname kütüphanesinin tam yolunu alır.
Örnekler
julia> dlpath("libjulia")Base.Libc.Libdl.find_library — Functionfind_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.
Base.DL_LOAD_PATH — ConstantDL_LOAD_PATHdlopen ç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.