מתרחשת שגיאת LNK2005 כאשר ספריית CRT ספריות MFC קשורות בסדר שגוי ב- Visual C++

תרגומי מאמרים תרגומי מאמרים
Article ID: 148652 - View products that this article applies to.
הרחב הכל | כווץ הכל

On This Page

מאפייני הבעיה

כאשר ספריית זמן ריצה C (CRT) ו- Microsoft Foundation ספריות מחלקה (MFC) מקושרים בסדר שגוי, ייתכן שתקבל אחת שגיאות LNK2005 הבאים:
nafxcwd.lib(afxmem.obj): שגיאה LNK2005:
"void * __cdecl מפעיל חדש (לא חתום int)"? (?2@YAPAXI@Z) כבר
הגדרה ב- LIBCMTD.lib(new.obj)
nafxcwd.lib(afxmem.obj): שגיאה LNK2005:
אופרטור void __cdecl" delete(void *)? "(?כבר מוגדר 3@YAXPAX@Z)
ב- LIBCMTD.lib(dbgnew.obj)
nafxcwd.lib(afxmem.obj): שגיאה LNK2005:
"void * __cdecl מפעיל חדש (לא חתום int, int, char const *, int)"
(??2@YAPAXIHPBDH@Z) מוגדרת כבר ב- LIBCMTD.lib(dbgnew.obj)
mfcs40d.lib(dllmodul.obj): שגיאה LNK2005: _DllMain@12 שהוגדרה כבר
MSVCRTD.ספריית (dllmain.obj)
mfcs42d.lib(dllmodul.obj): שגיאה LNK2005: _DllMain@12 שהוגדרה כבר
msvcrtd.lib(dllmain.obj)

סיבה

ספריות CRT להשתמש חלשות קישור חיצוני עבור חדשות, למחוק, ו פונקציות DllMain . ספריות MFC להכיל גם חדשים, למחוקופונקציות DllMain . פונקציות אלה דורשות ספריות MFC לקישור לפני CRT ספריית מקושר.

פתרון הבעיה

קיימות שתי דרכים לפתור את הבעיה. הראשונה הפתרון כרוך לכפות את מקשר (linker) כדי לקשר את ספריות נכון סדר. הפתרון השני מאפשר לך למצוא את המודול שגורם הבעיה ולתקן אותה.

הערה השלבים הבאים מבוססים על Visual C++ 6.0.

פתרון אחד: מקשר לספריות הקישור בסדר הנכון לכפות

  1. ב- פרוייקטתפריט, לחץ על הגדרות.
  2. ב- הגדרות עבור תצוגת שלהגדרות פרוייקט בתיבת הדו-שיח, לחץ כדי לבחור את הפרוייקט תצורת המקבל את השגיאות קישור.
  3. ב- קישור בכרטיסיה, לחץ כדי לבחור קלטב- קטגוריה תיבה משולבת.
  4. ב- התעלם ספריות תיבה, הוסף את שמות ספריה (עבור לדוגמה, Nafxcwd.lib;Libcmtd.lib).

    הערה מקשר (linker) שוות ערך שורת פקודה ב- /NOD:<library name=""></library>.
  5. ב- מודולים/ספריית אובייקטים תיבת, הוסף את שמות ספריה. עליך לוודא כי אלה מפורטים בסדר ו כמו ספריות שני תחילה על הקו (לדוגמה, Nafxcwd.lib Libcmtd.lib).
כדי להגדיר אפשרות זו ב- Visual C++ .NET, קרא את "הגדרה חזותית מאפייני פרוייקט C++"בנושא העזרה המקוונת.

פתרון שני: לאתר ולתקן את המודול בעיה

כדי להציג את סדר הקישור הספריה הנוכחית, בצע את הפעולות הבאות:
  1. ב- פרוייקטתפריט, לחץ על הגדרות.
  2. ב- הגדרות עבור תצוגת שלהגדרות פרוייקט בתיבת הדו-שיח, לחץ כדי לבחור את הפרוייקט תצורת המקבל את השגיאות קישור.
  3. ב- קישור בכרטיסיה, סוג/ מילולי: ספריית ב- אפשרויות פרוייקטתיבת.
  4. בנה מחדש את הפרוייקט. הספריות יפורטו חלון פלט במהלך תהליך הקישור.

סטטוס

פעולה זו התנהגות היא על-ידי עיצוב.

מידע נוסף

כאשר תשתמש ספריות MFC, עליך לוודא שיש הם מקושרים לפני הספריה CRT מקושר. באפשרותך לעשות זאת על-ידי הפיכת בטוח כי כל הקבצים בפרוייקט שלך כולל Msdev\Mfc\Include\Afx.h תחילה, אחת ישירות (#include <Afx.h>) או בעקיפין (#include <Stdafx.h>). Afx.h לכלול קובץ מאלץ את הסדר הנכון של ספריות, באמצעות הערה #pragma (lib,"<libname>") ההוראה. </libname></Stdafx.h></Afx.h>

אם קובץ המקור כולל סיומת .c, או הקובץ של .cpp הסיומת אינה אך לא להשתמש MFC, באפשרותך ליצור ולכלול קובץ כותרת קטנה (Forcelib.h) בחלק העליון של המודול. כותרת חדשה זו מוודא אשר סדר החיפוש thelibrary נכון.

Visual C++ אינו מכיל זה קובץ כותרת. כדי ליצור קובץ זה, בצע את הפעולות הבאות:
  1. פתח Msdev\Mfc\Include\Afx.h.
  2. בחר את השורות בין #ifndef _AFX_NOFORCE_LIBS ו #endif / /! _AFX_NOFORCE_LIBS.
  3. העתקת הבחירה ללוח של Windows.
  4. צור קובץ טקסט חדש.
  5. הדבקת תוכן הלוח לתוך קובץ חדש זה.
  6. שמור את הקובץ בשם Msdev\Mfc\Include\Forcelib.h.

שלבים לשחזור הבעיה ב- Visual C++ .NET

  1. הפעל את Microsoft Visual Studio .NET.
  2. ב- קובץ הצבע עלחדש, ולאחר מכן לחץ על פרוייקט.
  3. לחץ פרוייקטים של visual C++ תחתסוגי פרוייקט, ולאחר מכן לחץ על יישום MFCתחת תבניות.
  4. ב- שם תיבת טקסט, סוגQ148652.
  5. ב- מיקום תיבת טקסט, סוגC:\Test, ולאחר מכן לחץ על אישור.
  6. ב- אשף יישום MFC בתיבת הדו-שיח, לחץ סוג יישום.
  7. לחץ דו-שיח מבוסס תחתסוג יישום, ולאחר מכן לחץ על השתמש ב- MFC בסטטית ספריה תחת השימוש ב- MFC.
  8. לחץ סיום.
  9. בסייר פתרון, תחת קבצי המקורבחר את כל הקבצים .cpp שלוש.
  10. לחץ לחיצה ימנית על שלושה קבצים שנבחרו ולאחר מכן לחץהסר.
  11. לחץ לחיצה ימנית קבצי המקור, הצבע עללהוסיף, ולאחר מכן לחץ על הוסף פריט חדש.
  12. לחץ קבצי C++ תחתתבניות. ב- שם תיבת טקסט, סוגAa. לחץ פתח.
  13. הדבק את הקוד הבא בקובץ ה-Aa.cpp:
    int test(){new int; return 1;}
  14. לחץ לחיצה ימנית קבצי המקור, הצבע עללהוסיף, ולאחר מכן לחץ על הוסף פריט קיים.
  15. בחר את הקבצים הבאים:
    • Q148652.cpp
    • Q148652Dlg.cpp
    • stdafx.cpp
  16. לחץ פתח.
  17. הקבצים שבחרת בשלב 15 מופיעים תחתקבצי המקור.
  18. בחר את כל הקבצים .cpp ארבעה תחת מקור קבצים.
  19. לחץ לחיצה ימנית על ארבעת הקבצים .cpp שבחרת, ולאחר מכן לחץ מאפיינים.
  20. הרחב מאפייני תצורה, ולאחר מכן הרחב C/C++.
  21. לחץ כותרות שעבר קומפילציה.
  22. הגדר צור/השתמש בכותרת שעבר קומפילציההמאפיין שימוש לא שבוצע הידור מוקדם של כותרות. לחץאישור.
  23. ב- בנייה תפריט, לחץ על בנה מחדש פתרון.

מאפיינים

Article ID: 148652 - Last Review: יום שישי 07 יוני 2013 - Revision: 1.0
המידע במאמר זה חל על:
  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
מילות מפתח 
kbsweptvs2008 kbtshoot kbarttypeinf kberrmsg kbprb kbmt KB148652 KbMthe
תרגום מכונה
חשוב: מאמר זה תורגם באמצעות תוכנת תרגום מכונה של Microsoft וייתכן שנערך לאחר מכן על-ידי קהילת Microsoftבאמצעות טכנולוגייתCommunity Translation Framework (CTF) או באמצעות תרגום אנושי. Microsoft מציעה לך גם מאמרים בתרגום אנושי, מאמרים בתרגום מכונה ומאמרים שנערכו על ידי הקהילה כדי לאפשר גישה למאמרים הקיימים במאגר הידע (Knowledge Base) שלMicrosoft בשפות שונות. מאמרים מתורגמים יכולים להכיל שגיאות באוצר המילים, בתחביר או בדקדוק. Microsoft אינה אחראית לחוסר דיוק, שגיאות או נזקים שייגרמו כתוצאה מטעויות בתכנים או משימוש בתכנים על ידי לקוחותיה.
כותרת מאמר זה באנגלית: 148652

ספק משוב

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com