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

Συμπτώματα

Όταν η βιβλιοθήκη χρόνου εκτέλεσης C (CRT) και τις βιβλιοθήκες κλάσης βάση της Microsoft (MFC) συνδέονται με λανθασμένη σειρά, ενδέχεται να εμφανιστεί ένα από τα ακόλουθα μηνύματα λάθους LNK2005:
nafxcwd.lib(afxmem.obj): σφάλμα LNK2005:
"Ακύρωση * νέο τελεστή __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:
"Ακύρωση * νέο τελεστή __cdecl (char const ανυπόγραφο int, int, *, 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 χρησιμοποιούν χαμηλές εξωτερικής σύνδεσης για το νέο, να διαγράψετεκαι λειτουργίες DllMain . Τις βιβλιοθήκες MFC περιέχει επίσης νέεςλειτουργίες του, Διαγραφήκαι DllMain . Αυτές οι λειτουργίες απαιτούν τις βιβλιοθήκες MFC να συνδεθεί πριν από τη βιβλιοθήκη CRT είναι συνδεδεμένο.

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

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

Σημείωση Τα ακόλουθα βήματα βασίζονται σε Visual C++ 6.0.

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

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

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

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

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

Κατάσταση

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

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

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


Εάν το αρχείο προέλευσης έχει μια επέκταση .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, και στη συνέχεια κάντε κλικ στο κουμπί OK.
  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. Ορίστε την ιδιότητα Δημιουργία/χρήση προ-μεταγλωττισμένη κεφαλίδας Δεν χρησιμοποιούν οι κεφαλίδες προ-μεταγλωττισμένη. Κάντε κλικ στο κουμπί
    OK.
  23. Από το μενού Δημιουργία , κάντε κλικ στο κουμπί Αναδόμηση λύση.
Ιδιότητες

Αναγνωριστικό άρθρου: 148652 - Τελευταία αναθεώρηση: 10 Ιαν 2017 - Αναθεώρηση: 1

Σχόλια