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، سيتم البحث عن المسارات في هذه القائمة أولاً، بالترتيب، قبل البحث في مواقع النظام عن مقبض مكتبة صالح.