เกิดข้อผิดพลาดในการ LNK2005 เมื่อไลบรารี CRT และไลบรารี MFC ถูกเชื่อมโยงในใบสั่งไม่ถูกต้องใน c ++ Visual

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 148652 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

อาการ

เมื่อไลบรารี C เวลาเรียกใช้ (CRT) และไลบรารีคลาสมูลฐาน Microsoft (MFC) ถูกเชื่อมโยงในใบสั่งที่ไม่ถูกต้อง คุณอาจได้รับข้อผิดพลาดต่อไปนี้ของ LNK2005 อย่างใดอย่างหนึ่ง:
nafxcwd.lib(afxmem.obj): ข้อผิดพลาด LNK2005:
"โมฆะ * __cdecl ตัวใหม่ (ได้รับการรับรอง int) " (สี2@YAPAXI@Z) เรียบร้อยแล้ว
กำหนดใน LIBCMTD.lib(new.obj)
nafxcwd.lib(afxmem.obj): ข้อผิดพลาด LNK2005:
"โมฆะ delete(void *) ผู้ปฏิบัติงาน __cdecl" (สี3@YAXPAX@Z) กำหนดเรียบร้อยแล้ว
ใน LIBCMTD.lib(dbgnew.obj)
nafxcwd.lib(afxmem.obj): ข้อผิดพลาด LNK2005:
"โมฆะ * ตัวดำเนินการใหม่ __cdecl (ได้รับการรับรอง int, int อักขระ const *, int) "
(??การกำหนด 2@YAPAXIHPBDH@Z) ไว้แล้วใน LIBCMTD.lib(dbgnew.obj)
mfcs40d.lib(dllmodul.obj): ข้อผิดพลาด LNK2005: _DllMain@12 ที่กำหนดไว้แล้วใน
MSVCRTD.LIB (dllmain.obj)
mfcs42d.lib(dllmodul.obj): ข้อผิดพลาด LNK2005: _DllMain@12 ที่กำหนดไว้แล้วใน
msvcrtd.lib(dllmain.obj)

สาเหตุ

อ่อน linkage ภายนอกสำหรับใช้ไลบรารี CRTใหม่,ลบและDllMainฟังก์ชัน นอกจากนี้ยังประกอบด้วยไลบรารี MFCใหม่,ลบและDllMainฟังก์ชัน ฟังก์ชันเหล่านี้จำเป็นต้องมีไลบรารี MFC เชื่อมโยงก่อนที่ลิงค์กับไลบรารี CRT

การแก้ไข

มีสองวิธีแก้ปัญหานี้ โซลูชันที่แรกเกี่ยวข้องกับการบังคับให้ linker การเชื่อมโยงไลบรารีตามลำดับที่ถูกต้อง วิธีการแก้ไขปัญหาที่สองช่วยให้คุณ เพื่อหาโมดูลที่เป็นสาเหตุของปัญหา และ การแก้ไขได้

หมายเหตุ:ขั้นตอนต่อไปนี้จะขึ้นอยู่กับ c ++ 6.0 ที่แสดงผล

แก้ไขปัญหาหนึ่ง: ตัวเชื่อมโยงข้อมูลของบังคับใช้ไปยังไลบรารีการเชื่อมโยงในใบสั่งที่แก้ไข

  1. ในการProjectเมนู คลิกการตั้งค่า.
  2. ในการการตั้งค่าสำหรับดูการนั้นการตั้งค่าโครงการกล่องโต้ตอบ คลิกเพื่อเลือกการตั้งค่าคอนฟิกโครงการที่ได้รับข้อผิดพลาดในการเชื่อมโยง
  3. ในการการเชื่อมโยงแท็บ คลิกเพื่อเลือกป้อนข้อมูลในการประเภท:กล่องคำสั่งผสม
  4. ในการละเว้นไลบรารีกล่อง แทรกชื่อไลบรารี (ตัวอย่างเช่น Nafxcwd.lib;Libcmtd.lib)

    หมายเหตุ:การ linker บรรทัดคำสั่งเทียบใน /NOD:<library name=""></library>.
  5. ในการโมดูลที่/ไลบรารีวัตถุกล่อง แทรกชื่อไลบรารี คุณต้องมั่นใจว่า สิ่งเหล่านี้จะแสดงรายการ ตามลำดับ และ เป็นไลบรารีก่อนที่สองในบรรทัด (ตัวอย่างเช่น Nafxcwd.lib Libcmtd.lib)
การตั้งค่าตัวเลือกนี้ใน Visual c ++.NET อ่านหัวข้อวิธีใช้ออนไลน์ของ "การตั้งค่า Visual c ++คุณสมบัติของโครงการ"

โซลูชันที่สอง: หา และแก้ไขโมดูลปัญหา

เมื่อต้องการดูใบสั่งการเชื่อมโยงของไลบรารีปัจจุบัน ดำเนินการดังต่อไปนี้:
  1. ในการProjectเมนู คลิกการตั้งค่า.
  2. ในการการตั้งค่าสำหรับดูการนั้นการตั้งค่าโครงการกล่องโต้ตอบ คลิกเพื่อเลือกการตั้งค่าคอนฟิกโครงการที่ได้รับข้อผิดพลาดในการเชื่อมโยง
  3. ในการการเชื่อมโยงแท็บ ชนิด/ verbose: libในการตัวเลือกของโครงการกล่อง
  4. สร้างโครงการของคุณ ไลบรารีจะถูกแสดงในหน้าต่างการแสดงผลในระหว่างกระบวนการ linking

สถานะ

ลักษณะการทำงานนี้เกิดจากการออกแบบ

ข้อมูลเพิ่มเติม

เมื่อคุณใช้ไลบรารี MFC คุณต้องมั่นใจว่า จะถูกเชื่อมโยงก่อนที่ลิงค์กับไลบรารี CRT คุณสามารถทำได้ โดยการทำให้แน่ใจว่า ไฟล์ทุกไฟล์ที่อยู่ในโครงการของคุณรวม Msdev\Mfc\Include\Afx.h แรก ใดโดยตรง (#รวม <afx.h>) หรือโดยทางอ้อม (#รวม <stdafx.h>) ได้ Afx.h รวมแฟ้มบังคับลำดับถูกต้องของไลบรารี โดยใช้ directive ข้อคิดเห็น (lib, "<libname>") ของ #pragma </libname></stdafx.h></afx.h>

ถ้าแฟ้มต้นฉบับที่มีนามสกุลเป็น.c หรือแฟ้มมีนามสกุลเป็น.cpp แต่ไม่สามารถใช้ MFC คุณสามารถสร้าง และรวมหัวข้อที่ขนาดเล็กของแฟ้ม (Forcelib.h) ที่ด้านบนของโมดูได้ ส่วนหัวใหม่นี้ทำให้แน่ใจว่า ใบสั่งการค้นหา thelibrary ไม่ถูกต้อง

c ++ภาพไม่ประกอบด้วยแฟ้มหัวข้อนี้ เมื่อต้องการสร้างแฟ้มนี้ ดำเนินการดังต่อไปนี้:
  1. เปิด Msdev\Mfc\Include\Afx.h
  2. เลือกบรรทัดระหว่าง _AFX_NOFORCE_LIBS #ifndef #endif / / ! _AFX_NOFORCE_LIBS
  3. การคัดลอกส่วนที่เลือกไปยังคลิปบอร์ดของ Windows
  4. สร้างแฟ้มข้อความใหม่
  5. วางเนื้อหาของคลิปบอร์ดลงในแฟ้มนี้ใหม่
  6. บันทึกแฟ้มเป็น Msdev\Mfc\Include\Forcelib.h

ขั้นตอนในการทบทวนเกิดปัญหาใน Visual c ++.NET

  1. เริ่ม Microsoft Visual Studio .NET
  2. ในการแฟ้ม:เมนู ให้ชี้ไปที่ใหม่แล้ว คลิกProject.
  3. คลิกโครงการ visual ของ c ++ภายใต้ชนิดโครงการแล้ว คลิกแอพลิเคชัน mfcภายใต้แม่แบบ.
  4. ในการชื่อ:กล่องข้อความ ชนิดq148652.
  5. ในการตำแหน่ง:กล่องข้อความ ชนิดC:\testแล้ว คลิกตกลง.
  6. ในการตัวช่วยสร้างการแอพลิเคชัน mfcกล่องโต้ตอบ คลิกชนิดของแอพลิเคชัน.
  7. คลิกขึ้นอยู่กับการโต้ตอบภายใต้ชนิดของแอพลิเคชันแล้ว คลิกใช้ MFC ในไลบรารีแบบสแตติกภายใต้การใช้ MFC.
  8. คลิกเสร็จสิ้น.
  9. ในโซลูชัน Explorer ภายใต้แฟ้มแหล่งที่มาเลือกสาม.cpp แฟ้มทั้งหมด
  10. คลิกขวาที่แฟ้มที่เลือกสาม และจากนั้น คลิกเอาออก.
  11. คลิกขวาแฟ้มต้นฉบับชี้ไปที่addแล้ว คลิกเพิ่มรายการใหม่.
  12. คลิกแฟ้ม c ++ภายใต้แม่แบบ. ในการชื่อ:กล่องข้อความ ชนิดaa:. คลิกOPEN.
  13. วางรหัสต่อไปนี้ในแฟ้ม Aa.cpp:
    int test(){new int; return 1;}
  14. คลิกขวาแฟ้มแหล่งที่มาชี้ไปที่addแล้ว คลิกเพิ่มรายการที่มีอยู่.
  15. เลือกแฟ้มต่อไปนี้:
    • Q148652.cpp
    • Q148652Dlg.cpp
    • stdafx.cpp
  16. คลิกOPEN.
  17. แฟ้มที่คุณเลือกในขั้นตอนที่ 15 ปรากฏภายใต้แฟ้มแหล่งที่มา.
  18. เลือกทั้งหมดสี่.cpp แฟ้มภายใต้Source Files.
  19. Right-click the four .cpp files that you selected, and then clickคุณสมบัติ.
  20. ขยายConfiguration Properties, and then expandC/C++.
  21. คลิกPrecompiled Headers.
  22. Set theสร้าง/ใช้ Precompiled หัวข้อคุณสมบัติการไม่มีการใช้ Precompiled ส่วนหัว. คลิกตกลง.
  23. ในการการสร้างเมนู คลิกสร้างโซลูชัน.

คุณสมบัติ

หมายเลขบทความ (Article ID): 148652 - รีวิวครั้งสุดท้าย: 6 มกราคม 2554 - Revision: 4.0
ใช้กับ
  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 2002 Standard Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Keywords: 
kbsweptvs2008 kbtshoot kbarttypeinf kberrmsg kbprb kbmt KB148652 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ 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