ما هي أفضل طريقة للقضاء على MS Visual C++ رابط تحذير :"تحذير LNK4221"?

StackOverflow https://stackoverflow.com/questions/1822887

سؤال

لدي CPP الملف المصدر أن يستخدم #إذا / #endif تجميع تماما في بعض يبني.ومع ذلك ، فإن هذا يولد التحذير التالية.

warning LNK4221: no public symbols found; archive member will be inaccessible

كنت أفكر في إنشاء ماكرو لإنشاء دمية متغير أو دالة لن يكون في الواقع تستخدم حتى هذا الخطأ سوف تذهب بعيدا ولكن أريد أن تأكد من أنه لا يسبب مشاكل مثل استخدام الماكرو في ملفات متعددة تسبب رابط إلى قنبلة على مضاعفة الرموز المعرفة.

ما هي أفضل طريقة للتخلص من هذا التحذير (بدون ببساطة قمع التحذير على رابط سطر الأوامر) ?

FWIW, وأود أن تكون مهتمة في معرفة كيفية القيام بذلك عن طريق قمع التحذير على رابط سطر الأوامر أيضا ولكن كل محاولاتي يبدو أن هناك ببساطة تجاهلها من قبل linker و لا تزال تولد الخطأ.

واحد من المتطلبات الأخرى:الإصلاح يجب أن تكون قادرة على الوقوف في ملف فردي يبني أو الوحدة بناء (الجمع بين الملف CPP يبني) منذ واحدة من شركائنا في بناء تكوينات هو الأكبر في بناء (مثل وحدة بناء بل مجموعات من معظم الملفات بدلا من واحدة ماستر الوحدة الملف).

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

المحلول 2

حسنا الإصلاح وانا ذاهب الى استخدام بافل اقتراح مع قرص طفيفة.السبب أنا باستخدام هذا الإصلاح هو سهل الماكرو إلى انخفاض في و سيكون العمل في مجمع يبني / الوحدة-يبني فضلا عن العادي يبني:

مشترك الرأس:

// The following macro "NoEmptyFile()" can be put into a file
// in order suppress the MS Visual C++ Linker warning 4221
//
// warning LNK4221: no public symbols found; archive member will be inaccessible
//
// This warning occurs on PC and XBOX when a file compiles out completely
// has no externally visible symbols which may be dependant on configuration
// #defines and options.

#define NoEmptyFile()   namespace { char NoEmptyFileDummy##__LINE__; }

الملف الذي قد وضع خارج تماما:

NoEmptyFile()
#if DEBUG_OPTION
      // code
#endif // DEBUG_OPTION

نصائح أخرى

استخدام مجهول الاسم:

namespace { char dummy; };

الرموز داخل هذا الاسم يكون الخارجية الربط ، لذلك لن يكون هناك شيء في تصدير الجدول.من ناحية أخرى, مساحة الاسم في حد ذاته سوف تكون متميزة (يمكنك التفكير في الأمر "بشكل عشوائي") عن كل وحدة الترجمة, لذلك أي اشتباكات.

(على الرغم من المناقشة هو بالفعل قديمة لا أستطيع التعليق مباشرة @Adisak الجواب) اعتقد بعض إضافية التوسع الكلي السحر هو في حاجة لهذا العمل:

#define TOKENPASTE(x, y) x ## y
#define TOKENPASTE2(x, y) TOKENPASTE(x, y)
#define NONEMPTY_TRANSLATION_UNIT char TOKENPASTE2(NoEmptyFileDummy, __LINE__);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top