سؤال

يعتمد مشروع XCode الخاص بي على اختلافات في نفس المنتج باستخدام هدفين. الفرق بين الاثنين هو فقط على إصدار المكتبة المضمنة. بالنسبة لملفات مصدر .C ، من السهل تعيين الإصدار الصحيح إلى الهدف الصحيح باستخدام خانة الاختيار الهدف. ومع ذلك ، بما في ذلك ملف الرأس يتضمن دائمًا نفس الملف. هذا صحيح لهدف واحد ، ولكن خطأ بالنسبة للآخر.

هل هناك طريقة للتحكم في ملف الرأس الذي يتم تضمينه بواسطة كل هدف؟

إليكم التسلسل الهرمي لملف المشروع (الذي يتم نسخه في XCode):

MyProject
  TheirOldLib
    theirLib.h
    theirLib.cpp
  TheirNewLib
    theirLib.h
    theirLib.cpp
myCode.cpp

و mycode.cpp يفعل شيء مثل:

#include "theirLib.h"
…
somecode()
{
#if OLDVERSION
  theirOldLibCall(…);
#else
  theirNewLibCall(…);
#endif
}

وبالطبع ، أحدد OLDVERSION لهدف واحد وليس للآخر.

لاحظ ال #include يجب أن يكون كما هو موضح. كل من الفشل التالي مع ملف لم يتم العثور عليه:

#include "TheirOldLib/theirLib.h"
#include "TheirNewLib/theirLib.h"

فهل هناك طريقة لإخبار Xcode theirLib.h لتضمين هدف لكل هدف؟

قيود:
- ملف اثنين من الرأس له نفس الاسم. بصفتي الملاذ الأخير ، يمكنني إعادة تسمية أحدهم ، لكنني أفضل تجنب ذلك لأن هذا سيؤدي إلى سحب الشعر الرئيسي على المنصات الأخرى.
- الاضطرار إلى تغيير #include لإضافة إشارة إلى المجلد المرفق هو أيضًا شيء أفضل تجنبه ، لأنني سأحتاج إلى القيام بذلك مرتين بتوجيهات ترجمة مشروطة.
- أنا حر في تعديل مشروعي كما أرى بخلاف ذلك مناسب

شكرا على اي مساعدة.

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

المحلول

الجزء الرئيسي من الإجابة هو استخدام use_headermap = لا كما اقترح كريس في تعليق. التفاصيل هنا.

وصفة قصيرة (تم فحصها في Xcode 3.2.2):

  1. أضف إعدادًا مخصصًا لـ use_headermap = لا لكل هدف معني. هنا هو كيف:
    1.1. افتح لوحة معلومات الهدف على جزء "Build".
    1.2. اسحب القائمة المنبثقة لأسفل في أسفل اليسار من النافذة ، حدد "إضافة إعداد محدد من قبل المستخدم".
    1.3. في السطر المضافة حديثًا ، قم بتعيين العمود الأول ("الإعداد") إلى USE_HEADERMAP, والعمود الثاني ("القيمة") إلى NO.

  2. أضف المسار الصحيح إلى كل هدف (إعدادات البناء الهدف "مسارات بحث الرأس"). في المثال الخاص بي سيكون:
    2.1. يضيف TheirOldLib للهدف "القديم"
    2.2. يضيف TheirNewLib لهدف "جديد"

الخطوة 1 يعطل ميزة خريطة الرأس التلقائية لـ Xcode ، حيث يمكن الوصول إلى أي ملف رأس مضمّن في المشروع مباشرة من خلال اسمه ، مهما كان مساره الفعلي. عندما يكون للرأسان نفس الاسم ، تؤدي هذه الميزة إلى غموض لا يمكن حله.

الخطوة 2 يسمح ل #include "theirLib.h" للعمل دون تأهيل اسم ملف الرأس الفعلي.

هاتان الخطوتان معًا تفي بالقيود.

أخيراً، USE_HEADERMAP هو ليس وثقتها Apple ، بقدر ما أستطيع أن أقول. سأملأ تقرير الأخطاء لذلك ، لأن هذا الإعداد أمر بالغ الأهمية في عدد من الحالات ، كما يكشف googling. تم الإبلاغ عن RDAR: // 7840694. أيضا على الرادار المفتوح كما http://openradar.appspot.com/radar؟id=253401

نصائح أخرى

use_headermap = no هو مبالغة لبعض المشاريع. قد يكون يكفي فقط استخدام HeaderMap_includes_flat_entries_for_target_being_built = لا. الوثائق هنا: https://developer.apple.com/library/mac/documentation/developertools/reference/xcodebuildsettingref/1-build_setting_reference/build_setting_ref.html#//apple_ref/doc/uid/tp40003931-ch3-sw159

لماذا لا يمكنك استخدام مختلف المسارات في كل هدف؟

استخدم use_headermap = no وفي "مسارات البحث عن رأس المستخدم" ، قم بتضمين دليلك المخصص أولاً ودليل المشروع بشكل متكرر: $ {project_dir}/hernewlib $ {project_dir}/**

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top