Παρουσιάζεται ένα σφάλμα LNK2005 κατά τη βιβλιοθήκη CRT και τις βιβλιοθήκες MFC είναι συνδεδεμένα με λανθασμένη σειρά σε Visual C++

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 148652 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Συμπτώματα

Όταν η βιβλιοθήκη χρόνου εκτέλεσης C (CRT) και τις βιβλιοθήκες MFC (Microsoft Foundation κλάσης) συνδέονται με λανθασμένη σειρά, ενδέχεται να λάβετε ένα από τα ακόλουθα μηνύματα λάθους LNK2005:
nafxcwd.lib(afxmem.obj): σφάλμα LNK2005:
"void * __cdecl τελεστή νέα (ανυπόγραφο int)" (??2@YAPAXI@Z) ήδη
έχει οριστεί σε LIBCMTD.lib(new.obj)
nafxcwd.lib(afxmem.obj): σφάλμα LNK2005:
"Ακύρωση __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.LIB (dllmain.obj)
mfcs42d.lib(dllmodul.obj): σφάλμα LNK2005: _DllMain@12 ήδη οριστεί σε
msvcrtd.lib(DllMain.obj)

Αιτία

Οι βιβλιοθήκες CRT χρησιμοποιούν χαμηλές εξωτερικής σύνδεσης για τονέα,DeleteANDDllMainΣυναρτήσεις. Περιέχει επίσης τις βιβλιοθήκες MFCνέα,DeleteANDDllMainΣυναρτήσεις. Αυτές οι λειτουργίες απαιτούν τις βιβλιοθήκες MFC να συνδεθεί πριν από τη βιβλιοθήκη CRT είναι συνδεδεμένο.

Προτεινόμενη αντιμετώπιση

Υπάρχουν δύο τρόποι για να επιλύσετε αυτό το ζήτημα. Η πρώτη λύση περιλαμβάνει την επιβολή το πρόγραμμα σύνδεσης για να συνδέσετε τις βιβλιοθήκες με τη σωστή σειρά. Η δεύτερη λύση σάς δίνει τη δυνατότητα να εντοπίσει τη λειτουργική μονάδα που προκαλεί το πρόβλημα και να διορθώσετε.

ΣΗΜΕΙΩΣΗΤα ακόλουθα βήματα βασίζονται σε Visual C++ 6.0.

Μία λύση: Υποχρεωτική σύνδεσμος σε βιβλιοθήκες σύνδεσης στη σωστή σειρά

  1. Στο διακομιστήΤο έργομενού, κάντε κλικ στο κουμπίρυθμίσεις.
  2. ΣτοΡυθμίσεις γιαπροβολή από τοΡυθμίσεις έργουπαράθυρο διαλόγου, κάντε κλικ για να επιλέξετε τη ρύθμιση παραμέτρων του έργου που λαμβάνει τα σφάλματα σύνδεσης.
  3. Στο διακομιστήLinkκαρτέλα, κάντε κλικ για να επιλέξετεΕισαγωγή δεδομένωνΣτοΚατηγορίαΣύνθετο πλαίσιο (Combo Box).
  4. ΣτοΠαράβλεψη των βιβλιοθηκώνπλαίσιο, εισαγάγετε τα ονόματα βιβλιοθήκης (για παράδειγμα, Nafxcwd.lib;Libcmtd.lib).

    ΣΗΜΕΙΩΣΗΤο πρόγραμμα σύνδεσης της γραμμής εντολών ισοδύναμο στο /NOD:<library name=""></library>.
  5. ΣτοΒιβλιοθήκη αντικειμένων/λειτουργικών μονάδωνπλαίσιο, εισαγάγετε τα ονόματα βιβλιοθήκης. Θα πρέπει να βεβαιωθείτε ότι αυτά παρατίθενται με τη σειρά και με τις δύο πρώτες βιβλιοθήκες στη γραμμή (για παράδειγμα, Nafxcwd.lib Libcmtd.lib).
Για να ορίσετε αυτή την επιλογή σε Visual C++ .NET, διαβάστε το θέμα "Ρύθμιση Visual C++ Ιδιότητες έργου" ηλεκτρονική Βοήθεια.

Δύο λύση: Εντοπίστε και διορθώστε το πρόβλημα μονάδας

Για να προβάλετε την τρέχουσα βιβλιοθήκη σειρά σύνδεσης, ακολουθήστε τα εξής βήματα:
  1. Στο διακομιστήΤο έργομενού, κάντε κλικ στο κουμπίρυθμίσεις.
  2. ΣτοΡυθμίσεις γιαπροβολή από τοΡυθμίσεις έργουπαράθυρο διαλόγου, κάντε κλικ για να επιλέξετε τη ρύθμιση παραμέτρων του έργου που λαμβάνει τα σφάλματα σύνδεσης.
  3. Στο διακομιστήLinkκαρτέλα, τύπος/ λεπτομερούς: libΣτοΕπιλογές έργου"Τύπος" (Type).
  4. Αναδημιουργήστε το έργο σας. Οι βιβλιοθήκες παρατίθενται στο παράθυρο αποτελεσμάτων κατά τη διαδικασία σύνδεσης.

Κατάσταση

Αυτή η συμπεριφορά οφείλεται στη σχεδίαση.

Περισσότερες πληροφορίες

Όταν χρησιμοποιείτε τις βιβλιοθήκες MFC, πρέπει να βεβαιωθείτε ότι έχουν συνδεθεί πριν από τη βιβλιοθήκη CRT είναι συνδεδεμένο. Μπορείτε να το κάνετε αυτό, εξασφαλίζοντας ότι όλα τα αρχεία στο έργο σας περιλαμβάνει Msdev\Mfc\Include\Afx.h πρώτη, είτε άμεσα (# include <afx.h>) ή έμμεσα (# include <stdafx.h>). Το Afx.h περιλαμβάνουν αρχείο επιβάλλει τη σωστή σειρά των βιβλιοθηκών, χρησιμοποιώντας την οδηγία σχόλιο (lib, "<libname>") # pragma. </libname></stdafx.h></afx.h>

Εάν το αρχείο προέλευσης έχει μια επέκταση .c, ή το αρχείο έχει επέκταση .cpp, αλλά δεν χρησιμοποιεί MFC, μπορείτε να δημιουργήσετε και να συμπεριλάβετε ένα μικρό κεφαλίδας του αρχείου (Forcelib.h) στο επάνω μέρος της λειτουργικής μονάδας. Αυτή η νέα κεφαλίδα βεβαιώνεται ότι η σειρά αναζήτησης thelibrary είναι σωστή.

Το Visual 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.

Steps to Reproduce the Problem in Visual C++ .NET

  1. Start Microsoft Visual Studio .NET.
  2. Στο διακομιστήFILEμενού, σημείοΝέα, και στη συνέχεια κάντε κλικ στο κουμπίΤο έργο.
  3. Κάντε κλικVisual C++ ProjectsunderProject Types, και στη συνέχεια κάντε κλικ στο κουμπίMFC ApplicationunderTemplates.
  4. ΣτοNAMEπλαίσιο κειμένου, πληκτρολογήστεQ148652.
  5. ΣτοΘέσηπλαίσιο κειμένου, πληκτρολογήστεC:\Test, και στη συνέχεια κάντε κλικ στο κουμπίOk.
  6. ΣτοMFC Application Wizarddialog box, clickApplication Type.
  7. Κάντε κλικDialog basedunderApplication type, και στη συνέχεια κάντε κλικ στο κουμπίUse MFC in a static libraryunderUse of MFC.
  8. Κάντε κλικΦινλανδικά.
  9. In Solution Explorer, underSource Filesselect all the three .cpp files.
  10. Right-click the three selected files, and then clickκατάργηση.
  11. Κάντε δεξιό κλικ στο στοιχείοSource files, τοποθετήστε το δείκτηADD, και στη συνέχεια κάντε κλικ στο κουμπίAdd New Item.
  12. Κάντε κλικC++ filesunderTemplates. ΣτοNAMEπλαίσιο κειμένου, πληκτρολογήστεAa. Κάντε κλικOpen.
  13. Paste the following code in the Aa.cpp file:
    int test(){new int; return 1;}
  14. Κάντε δεξιό κλικ στο στοιχείοSource Files, τοποθετήστε το δείκτηADD, και στη συνέχεια κάντε κλικ στο κουμπίAdd Existing Item.
  15. Select the following files:
    • Q148652.cpp
    • Q148652Dlg.cpp
    • stdafx.cpp
  16. Κάντε κλικOpen.
  17. The files that you selected in step 15 appear underSource Files.
  18. Select all four .cpp files underSource Files.
  19. Right-click the four .cpp files that you selected, and then clickΙδιότητες (Properties).
  20. expandConfiguration Properties, and then expandC/C++.
  21. Κάντε κλικPrecompiled Headers.
  22. Ορισμός τουΔημιουργία/χρήση προ-μεταγλωττισμένη κεφαλίδαςη ιδιότητα ναΧρήση δεν προ-μεταγλωττισμένη κεφαλίδων. Κάντε κλικOk.
  23. Στο διακομιστήΔημιουργίαμενού, κάντε κλικ στο κουμπίΑναδόμηση λύσης.

Ιδιότητες

Αναγν. άρθρου: 148652 - Τελευταία αναθεώρηση: Σάββατο, 18 Δεκεμβρίου 2010 - Αναθεώρηση: 2.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 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της 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