Libdl
— Moduleيوفر نموذج Libdl في جوليا مرافق متخصصة وأدنى مستوى للربط الديناميكي مع المكتبات المشتركة. بينما تدعم جوليا بشكل أساسي الربط بمكتبات مشتركة في وقت التشغيل من خلال الدالة ccall
، فإن Libdl
توسع هذه القدرة من خلال تقديم تحكم إضافي وأكثر دقة. يتيح للمستخدمين البحث عن المكتبات المشتركة سواء في الذاكرة أو نظام الملفات، وتحميلها يدويًا مع خيارات محددة لربط وقت التشغيل، والبحث عن رموز المكتبة كمؤشرات منخفضة المستوى.
Dynamic Linker
Base.Libc.Libdl.dlopen
— Functiondlopen(libfile::AbstractString [, flags::Integer]; throw_error:Bool = true)
قم بتحميل مكتبة مشتركة، مع إرجاع مقبض غير شفاف.
يمكن حذف الامتداد المعطى بواسطة الثابت dlext
(.so
، .dll
، أو .dylib
) من سلسلة libfile
، حيث يتم إضافته تلقائيًا إذا لزم الأمر. إذا لم يكن libfile
اسم مسار مطلق، فسيتم البحث في المسارات الموجودة في مصفوفة DL_LOAD_PATH
عن libfile
، تليها مسار تحميل النظام.
حجة العلامات الاختيارية هي عملية OR بت bitwise للصفر أو أكثر من RTLD_LOCAL
، RTLD_GLOBAL
، RTLD_LAZY
، RTLD_NOW
، RTLD_NODELETE
، RTLD_NOLOAD
، RTLD_DEEPBIND
، و RTLD_FIRST
. يتم تحويل هذه إلى العلامات المقابلة لأمر dlopen في POSIX (و/أو GNU libc و/أو MacOS)، إذا كان ذلك ممكنًا، أو يتم تجاهلها إذا كانت الوظيفة المحددة غير متاحة على النظام الحالي. العلامات الافتراضية خاصة بالمنصة. على 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
— Functiondlopen_e(libfile::AbstractString [, flags::Integer])
مماثل لـ dlopen
، باستثناء أنه يُرجع C_NULL
بدلاً من رفع الأخطاء. هذه الطريقة أصبحت الآن مهجورة لصالح dlopen(libfile::AbstractString [, flags::Integer]; throw_error=false)
.
Base.Libc.Libdl.RTLD_NOW
— ConstantRTLD_DEEPBIND
RTLD_FIRST
RTLD_GLOBAL
RTLD_LAZY
RTLD_LOCAL
RTLD_NODELETE
RTLD_NOLOAD
RTLD_NOW
ثابت تعداد لـ dlopen
. راجع صفحة دليل النظام الخاص بك لمزيد من التفاصيل، إذا كان ذلك مناسبًا.
Base.Libc.Libdl.dlsym
— Functiondlsym(handle, sym; throw_error::Bool = true)
ابحث عن رمز من مقبض مكتبة مشتركة، وأعد مؤشر دالة قابلة للاستدعاء عند النجاح.
إذا لم يمكن العثور على الرمز، فإن هذه الطريقة ترمي خطأ، ما لم يتم تعيين وسيط الكلمة الرئيسية throw_error
إلى false
، وفي هذه الحالة تعيد هذه الطريقة nothing
.
Base.Libc.Libdl.dlsym_e
— Functiondlsym_e(handle, sym)
ابحث عن رمز من مقبض مكتبة مشتركة، وأعد C_NULL
بصمت عند فشل البحث. هذه الطريقة أصبحت الآن قديمة لصالح dlsym(handle, sym; throw_error=false)
.
Base.Libc.Libdl.dlclose
— Functiondlclose(handle)
إغلاق المكتبة المشتركة المشار إليها بواسطة handle.
dlclose(::Nothing)
للنمط الشائع جداً من الاستخدام
try
hdl = dlopen(library_name)
... do something
finally
dlclose(hdl)
end
نقوم بتعريف طريقة dlclose()
التي تقبل معلمة من نوع Nothing
، حتى لا تضطر شيفرة المستخدم إلى تغيير سلوكها في حالة عدم العثور على library_name
.
Base.Libc.Libdl.dlext
— Constantdlext
امتداد الملف للمكتبات الديناميكية (مثل dll، dylib، so) على النظام الحالي.
Base.Libc.Libdl.dllist
— Functiondllist()
إرجاع مسارات المكتبات الديناميكية المحملة حاليًا في Vector{String}
.
Base.Libc.Libdl.dlpath
— Functiondlpath(handle::Ptr{Cvoid})
بالنظر إلى مكتبة handle
من dlopen
، أعد المسار الكامل.
dlpath(libname::Union{AbstractString, Symbol})
احصل على المسار الكامل للمكتبة libname
.
أمثلة
julia> dlpath("libjulia")
Base.Libc.Libdl.find_library
— Functionfind_library(names [, locations])
يبحث عن أول مكتبة في names
في المسارات الموجودة في قائمة locations
، وDL_LOAD_PATH
، أو مسارات المكتبات النظامية (بهذا الترتيب) التي يمكن فتحها بنجاح باستخدام dlopen. عند النجاح، ستكون قيمة الإرجاع واحدة من الأسماء (قد تكون مسبوقة بأحد المسارات في locations). يمكن تعيين هذه السلسلة إلى global const
واستخدامها كاسم المكتبة في استدعاءات ccall
المستقبلية. عند الفشل، تعيد السلسلة الفارغة.
Base.DL_LOAD_PATH
— ConstantDL_LOAD_PATH
عند استدعاء dlopen
، سيتم البحث عن المسارات في هذه القائمة أولاً، بالترتيب، قبل البحث في مواقع النظام عن مقبض مكتبة صالح.