الكشف عن تجميع Windows و *NIX
-
20-09-2019 - |
سؤال
يجب تجميع مشروع واحد لنظام التشغيل 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 %*