سؤال

يجب تجميع مشروع واحد لنظام التشغيل Windows و Linux وهدف مضمن. التطبيق لديه اختلافات السلوك عند التشغيل على الأهداف المضيفة أو المضمنة. لتلخيص متطلباتي ، إليك الجدول:

   Target               Compiler      Behavior
   Windows              MSVC, gcc         A
   Host Linux           gcc               A
   Embedded Linux       cross pltf gcc    B

أرغب في إنشاء جهاز تصنيع من شأنه أن يتعرف على البرمجيات والاختلافات البيئية تلقائيًا (دون الحاجة إلى تمرير المعلمات/تعريفها يدويًا). هل من الممكن حل هذه المشكلة من خلال استخدام التجميع الشرطي على مستوى ملف C؟
أنا لا أستخدم Automake حتى الآن.

هل كانت مفيدة؟

المحلول

ال Autotools صنعت لحل هذه المشكلة. لا يمكن أن يفعل هذا الأمر في حد ذاته.

أما بالنسبة للتجميع الشرطي ، فهناك العديد من وحدات الماكرو التي تحددها هذه المترجمين (على سبيل المثال _MSC_VER لـ MSVC ++ ، _WIN32 لنظام التشغيل Windows و و __linux__ للينكس). أيضا ، توفر GCC تأكيدات للتعامل مع أهداف وحدة المعالجة المركزية المختلفة.

Target         Compiler     Conditional
Windows        MSVC++       #ifdef _MSC_VER
Windows        gcc          #if defined(_WIN32) && defined(__GNUC__)
Linux          gcc          #if defined(__linux__) && defined(__GNUC__)
Platform (x86) gcc          #if #cpu(i386)
Platform (arm) gcc          #if #cpu(arm)

يجب أن يكون ذلك كافيًا لأغراضك.

نصائح أخرى

جوابي هو: ربما. يعتمد ذلك على الاختلافات بين بيئاتك.

أود أن أقوم بإنشاء قائمة من وحدات الماكرو المحددة مسبقًا من قبل المعالج المسبق في مجلس التعاون الخليجي لكل من بيئاتك. كل ما عليك فعله هو إنشاء ملف فارغ ، على سبيل المثال foo.h, وتشغيل الأمر التالي: gcc -E -dM foo.h لكل بيئة. سأعيد توجيه الإخراج إلى ملف مختلف لكل بيئة.

بعد ذلك ، قارن وحدات الماكرو المحددة مسبقًا وابحث عن واحدة تناسب الفاتورة. في سؤالك ، أشارت إلى أن البيئة المدمجة لها سلوك مختلف عن Windows and Linux من منصات Linux. على افتراض أنك تستخدم بنية رقاقة مختلفة للبيئة المضمنة ، يجب أن يكون هناك ماكرو محدد يشير إلى البنية. على سبيل المثال ، في صندوق Linux 64 بت ، __x86_64__ ويعرف.

بمجرد حصولك على هذه المعلومات ، استخدم هذا الماكرو كقيمة مشروطة:

#ifdef MACRO_INDICATING_EMBEDDED
// Behavior B
#else
// Behavior A
#endif

سوف يحدد مجلس التعاون الخليجي

 __linux__

عند التجميع على Linux. تحدد MSVC شيئًا مشابهًا - لقد نسيت أيًا لكنني متأكد من أن المستندات ستخبرك

ولكن في الحقيقة تحتاج إلى تعلم كيفية استخدام التكوين. هذا ما ل. إنه ألم للتعلم ولكنه مفيد للغاية (Automake ، Autoconf إلخ)

يمكنك تجربة مجموعة من وحدات الماكرو المحددة مسبقًا أنظمة التشغيل و البنى; ؛ ربما مثيرة للاهتمام أيضا: معرفات التحويل البرمجي.

إذا كنت لا ترغب في استخدام نظام بناء أكثر تطوراً ، فيمكنك تحليل وسيطات سطر الأوامر داخل Makefile. مثال بسيط هو إضافة .exe إلى أسماء قابلة للتنفيذ على Windows. لهذا لدي رمز مثل هذا داخل makefile

ifeq ($(target),win32)
    foo_binary := $(foo_binary).exe
endif

واستدعاء جعل عبر أ make.bat ملف يحتوي

@make.exe target=win32 %*
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top