أهلا،
أقوم بإنشاء حزمة (غير رسمية) لـ Archlinux (التوزيع الخاص بي) و makepkg
(أداة إنشاء حزمة التوزيع) يحذرني من أن xxhsum
يحتوي على مرجع لبناء دليل.
لقد تحققت من ذلك مع
$ strings xxhsum | grep BUILD_DIR
ووجدت حدثًا واحدًا فقط. حاولت إنشاء الحزمة بعلامة --save-temps
لدول مجلس التعاون الخليجي ووجدت الملف BUILD_DIR
في ملف xxhsum.o.s
. لا أفهم تنسيق هذا الملف ولكن وفقًا لمحيط السلسلة ، قد يكون مرتبطًا بطريقة ما بوظيفة XXXbenchHash
. لسوء الحظ ، لم أتمكن من معرفة كيفية وصول هذه السلسلة إلى xxhsum
، ولا أرى أي استخدام لوحدات الماكرو الخاصة هناك.
أرغب في التخلص من هذه السلسلة (انظر ، على سبيل المثال ، "الإنشاءات القابلة للتكرار") ولكنني الآن ضائع وليس لدي أي فكرة عما يجب القيام به أكثر. هل لدى أي شخص فكرة عن كيفية التخلص من هذه السلسلة في النظام الثنائي المترجم أو يعرف كيفية تصحيح المشكلة؟
هذا غريب جدا.
لا يوجد شيء داخل شفرة المصدر xxhsum.c
عرضة لإنشاء مرجع إلى BUILD_DIR
.
قمت بتجميعها على Linux mint vm ، وقمت بإجراء نفس الفحص كما يلي:
$ strings xxhsum | grep BUILD_DIR
$
لم يرد أي شيء.
قد تكون قطعة أثرية من نظام البناء.
أفترض أنك تستخدم الدليل الفعلي بدلاً من BUILD_DIR ، أليس كذلك؟ إذا قمت بذلك ، فقد تكون على حق ، فهذه قطعة أثرية من أداة البناء الخاصة بي. سأحاول نظام مختلف للتحقق من ذلك. بالنسبة إلى نظامي الحالي ، يمكنني إعادة إنتاج هذا يدويًا:
$ cd DIR_WITH_UNPACKED_SOURCE
$ mkdir build
$ cmake ../xxHash-0.6.5
$ make
$ strings xxhsum | grep BUILD_DIR
BUILD_DIR:
DIR_WITH_UNPACKED_SOURCE/xxHash-0.6.5/xxhsum.c
البيئة: bash 4.4.023، GCC 8.1.1 20180531، binutils 2.30، cmake 3.11.4، make 4.2.1، glibc 2.27.
آه ، لم أختبر cmake
، وقد يكون هذا هو سبب ظهور هذه المشكلة.
لقد اختبرت فقط عملية إنشاء make
الأبسط:
$ cd XXH_SRC_DIR
$ make
$ strings xxhsum | grep BUILD_DIR
$
cmake
يتم صيانته من قِبل طرف ثالث (ومن هنا جاءت العلامة "غير الرسمية") ، لا أفهم جميع العناصر الداخلية والآثار الجانبية ، لسوء الحظ ، وأحتفظ رسميًا فقط بـ Makefile
.
أهلا،
للسجل ، وجدت سبب المشكلة وحلها. باختصار: استخدم الملف التالي CMakeLists.txt
وضعه في الدليل العلوي.
قصة طويلة: يرجع المرجع إلى دليل المصدر إلى الماكرو __FILE__
بكل أشكاله. في هذه الحالة بالذات يتسلل من خلال الماكرو assert
. إذا قام أحدهم بترجمة المشروع داخل الدليل المصدر ، فلا توجد مشكلة لأنه في هذه الحالة يتم توسيع __FILE__
(بواسطة المترجم) إلى مسار نسبي. لكن إحدى أكثر ميزات cmake
استخدامًا هي التجميع خارج دليل المصدر وفي هذه الحالة يقوم المترجم بتوسيع الماكرو __FILE__
إلى المسار الكامل. ومع ذلك ، من الممكن استخدام المسارات المتعلقة بالدليل المصدر ولكن يتعين على المرء إعادة تعريف الماكرو __FILE__
. يمكن للمرء استخدام cmake
كما هو موضح في الملف أعلاه.
أهلا!
أعتقد أنه يجب تعريف الماكرو assert
على أنه (void)0
إذا تم تعريف NDEBUG
.
NDEBUG
تلقائيًا بواسطة CMake إذا تم تعيين CMAKE_BUILD_TYPE على _ "Release" _ (لمولدات التكوين الفردي مثل Unix Makefiles) أو إذا كان إنشاء مشروع بخيار --config Release
(لمولدات التكوين المتعددة مثل Xcode) .
بالنسبة إلى _ "RelWithDebInfo" _ نوع البناء ، يجب تحديد NDEBUG
خلال امتلاكه في المصادر أو في قوائم CMake.
لقد اختبرت ذلك للتو.
حظا طيبا وفقك الله!
تم تحديث منطق assert
، وتم تعريفه هنا:
https://github.com/Cyan4973/xxHash/blob/dev/xxhash.c#L146
افتراضيًا ، يتم تعطيل كافة التأكيدات في xxhash
.
لتمكينها ، يلزم تعيين DEBUGLEVEL
على قيمة >= 1
.
حتى في هذه الحالة ، لا يزال من الممكن تعطيل assert()
من خلال تعيين NDEBUG
.
مهما كانت قيمة DEBUGLEVEL
،
لن يتم تعديل إعداد NDEBUG
،
يظل كما هو تمامًا بعد تضمين رمز xxhash
(عادةً بـ XXH_INLINE_ALL
، وهو نوع البناء الأكثر تأثيرًا).
أعتقد أنه تم إصلاح هذه المشكلة.
اختبرت cmake
أنتجته xxhsum
على نظام Linux باستخدام strings
، ولم أجد أي مرجع لـ BUILD_DIR
.
التعليق الأكثر فائدة
أهلا،
للسجل ، وجدت سبب المشكلة وحلها. باختصار: استخدم الملف التالي
CMakeLists.txt
وضعه في الدليل العلوي.قصة طويلة: يرجع المرجع إلى دليل المصدر إلى الماكرو
__FILE__
بكل أشكاله. في هذه الحالة بالذات يتسلل من خلال الماكروassert
. إذا قام أحدهم بترجمة المشروع داخل الدليل المصدر ، فلا توجد مشكلة لأنه في هذه الحالة يتم توسيع__FILE__
(بواسطة المترجم) إلى مسار نسبي. لكن إحدى أكثر ميزاتcmake
استخدامًا هي التجميع خارج دليل المصدر وفي هذه الحالة يقوم المترجم بتوسيع الماكرو__FILE__
إلى المسار الكامل. ومع ذلك ، من الممكن استخدام المسارات المتعلقة بالدليل المصدر ولكن يتعين على المرء إعادة تعريف الماكرو__FILE__
. يمكن للمرء استخدامcmake
كما هو موضح في الملف أعلاه.