سؤال

لدي حل كبير مع الكثير من المشاريع باستخدام VS2008 SP1 على الأقل مرة واحدة في اليوم لا تواجه LNK2022 خطأ.إذا كنت تفعل بناء كامل من الحل فإنه يبني بشكل جيد ، ولكن هذه ليست متعة.

يحدث ذلك عندما تعتمد DLL يتم تغيير 'معنويا' (أيدون تغيير أي أساليب أو الطبقات) و الرجوع المشروع في وقت لاحق.فشل عند دمج البيانات الوصفية - أيا كان ذلك يعني.

أول شيء هو أن نلاحظ أن DLL المشتركة المشار إليها مع #using من متعددة .CPP الملفات.
الشيء الثاني هو أنه إذا كنت حذف AssemblyInfo.cpp من DLL المشتركة ثم انتهت المشكلة (ولكن أنا لست متأكدا إذا كان هذا هو المعقول الإصلاح ؟ ).

لقد ضاقت عليه بقدر الإمكان إلى ما يلي الحل تحتوي على 2 CLR مكتبة فئة المشاريع (على xxx المشروع يعتمد على مشترك):
alt text

وإليك محتويات كل ملف:

Shared.cpp:

public ref class Shared
{
};

inc.h:

#pragma once
#using "Shared.dll"
public ref class Common
{
private:
    Shared^ m_fred;
};

xxx.cpp و xxx2.cpp:

#include "inc.h"

إلى إعادة إنتاج أول بناء الحل.فإنه سيتم بناء موافق.
الآن حفظ Shared.cpp و بناء الحل ، فإنه سيتم بناء على ما يرام و تظهر:

...
2>------ Build started: Project: xxx, Configuration: Debug Win32 ------
2>Inspecting 'd:\xxx\xxx\Debug\Shared.dll' changes ...
2>No significant changes found in 'd:\xxx\xxx\Debug\Shared.dll'.
2>xxx - 0 error(s), 0 warning(s)
========== Build: 2 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

الآن حفظ xxx.cpp وبناء الحل فشل مع رسالة الخطأ التالية:

1>------ Build started: Project: xxx, Configuration: Debug Win32 ------
1>Compiling...
1>xxx.cpp
1>Linking...
1>xxx2.obj : error LNK2022: metadata operation failed (80131188) : Inconsistent field declarations in duplicated types (types: Common; fields: m_fred): (0x04000001).
1>LINK : fatal error LNK1255: link failed because of metadata errors
1>xxx - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ==========

تحرير:
الاختلافات بين IL بالنسبة xxx.obj و xxx2.الكائنات هي كما يلي:

(على xxx.الكائنات)
// AssemblyRef #2 (23000002)
// -------------------------------------------------------
// مميز:0x23000002
// المفتاح العام أو رمزية:
// الاسم:مشترك
// الإصدار:1.0.3412.16606
// الإصدار الرئيسي:0x00000001
// الإصدار الثانوي:0x00000000
// بناء عدد:0x00000d54
// رقم المراجعة:0x000040دي
// الإعدادات المحلية:
// HashValue النقطة: 1c bb 8f 13 7e با 0a c7 26 c6 fc cb f9 اد 71 bf 5d ab b0 c0
// الأعلام:[لا شيء] (00000000)

(على xxx2.الكائنات)
// AssemblyRef #2 (23000002)
// -------------------------------------------------------
// مميز:0x23000002
// المفتاح العام أو رمزية:
// الاسم:مشترك
// الإصدار:1.0.3412.16585
// الإصدار الرئيسي:0x00000001
// الإصدار الثانوي:0x00000000
// بناء عدد:0x00000d54
// رقم المراجعة:0x000040c9
// الإعدادات المحلية:
// HashValue النقطة: 64 af d3 12 9d e3 f6 2b 59 ac ff e5 3b 38 f8 fc 6d f4 d8 b5
// الأعلام:[لا شيء] (00000000)

هذا يعني لي أن xxx2.الكائنات لا تزال تستخدم نسخة قديمة من Shared.dll و التي تتعارض مع xxx.الكائنات التي تستخدم تحديث Shared.dll.فكيف يمكنني أن الحل إذن ؟

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

المحلول 2

مايكروسوفت ردت إلى ربط آخر ، مع أفضل بكثير من الحل:

يبدو أن سبب المشكلة عدم التوافق في الإصدار بين اثنين .objs.أفضل الحل محل

[الجمعية:AssemblyVersionAttribute("1.0.*")];

مع

[الجمعية:AssemblyVersionAttribute("1.0.0.1")];

في AssemblyInfo.cpp.وهذا يضمن أن النسخة لا يتغير بين تدريجي يبني.

يعمل هذا بالنسبة لي و من الواضح أن هذا هو الأفضل تعطيل الميزة.
على كل حال الجواب المقبول وقد تم اختيار ولا يمكن تغييره الآن :(

نصائح أخرى

تحدث هذه المشكلة عن طريق المدار الجديد تدريجي بناء الميزة في Visual Studio 2008.كما رصدت ، الفوقية لم تتغير ، ولكن ليس في الطريقة التي تدار تدريجي بناء الميزة تعتبر ذات معنوية حقيقية.ومع ذلك ، إذا فرض ترجمة واحد من ملفات cpp ، المسكات الجديدة الفوقية ، يضمن ذلك في الكائنات ، ثم رابط يرى الصراع.

هناك طريقتان لحل هذه المشكلة.طريقة بسيطة التي يبدو للعمل ، demoncodemonkey الجواب أدناه هو تحديد صريح رقم الإصدار في التجميع المشار إليه الوصفية إلى إرشاد المترجم أن التجميع المشار إليه هو في الواقع في نفس الإصدار:

محل

[assembly:AssemblyVersionAttribute("1.0.*")];

مع

[assembly:AssemblyVersionAttribute("1.0.0.1")];

في AssemblyInfo.cpp. وسوف يضمن هذا الإصدار لا التغيير بين تدريجي يبني.

طريقة بديلة لتجنب هذه المشكلة عن طريق تعطيل ميزة.قد إعادة ترجمة بعض cpp الملفات دون داع, لكنه أفضل من وجود رابط تفشل.

في خصائص المشروع في إطار تكوين خصائص > عام ، تعيين "تمكين إدارة تدريجية بناء" إلى "لا".

جرب هذا في xxx.cpp و xxx2.cpp:

#ifndef _PROTECT_MY_HEADER
#define _PROTECT_MY_HEADER
#include  "inc.h"
#endif

#pragma once لا يكفي لحماية الرأس في هذه الحالة.

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