Visual C++ yanlış sırada CRT kitaplığı ve MFC kitaplıklarını bağlandığında LNK2005 bir hata oluşur.

Makale çevirileri Makale çevirileri
Makale numarası: 148652 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Belirtiler

Microsoft Foundation Class (MFC) kitaplıkları ve C çalışma zamanı (CRT) kitaplığı yanlış sırada bağlandığında LNK2005 aşağıdaki hatalardan birini alabilirsiniz:
nafxcwd.lib(afxmem.obj): <a1>hata</a1> LNK2005:
"void * __cdecl işletmen yeni (imzasız int)" (??2@YAPAXI@Z) zaten
LIBCMTD.lib(New.obj) tanımlı
nafxcwd.lib(afxmem.obj): <a1>hata</a1> LNK2005:
"__cdecl işletmen delete(void *) geçersiz" (??3@YAXPAX@Z) zaten tanımlı
içinde LIBCMTD.lib(dbgnew.obj)
nafxcwd.lib(afxmem.obj): <a1>hata</a1> LNK2005:
"void * __cdecl işletmen new(unsigned int,int,char const *,int)"
(??2@YAPAXIHPBDH@Z) LIBCMTD.lib(dbgnew.obj) tanımlı
mfcs40d.lib(dllmodul.obj): <a1>hata</a1> LNK2005: _DllMain@12 zaten tanımlanmış
MSVCRTD.LIB (dllmain.obj)
mfcs42d.lib(dllmodul.obj): <a1>hata</a1> LNK2005: _DllMain@12 zaten tanımlanmış
msvcrtd.lib(DllMain.obj)

Neden

CRT kitaplıkları, Yeni, delete ve DllMain işlevi için zayıf dış bağlantı kullanın. MFC kitaplıklarını, Yenisilmek ve DllMain işlevi de içerir. Bu işlevler, CRT kitaplığı bağlı olduğu için önce bağlantı kurulacak MFC kitaplıklarını gerektirir.

Çözüm

Bu sorunu gidermek için iki yol vardır. Doğru sırada kitaplıklarında bağlamak için bu linker zorlama ilk çözüm içerir. Ikinci çözüm, soruna neden olan modülü bulmak ve düzeltmek için sağlar.

Not Aşağıdaki adımlar, Visual C++ 6.0 temel alır.

Bir çözüm: Bağlantı kitaplıkları doğru sırası Force Bağlayıcısı

  1. Proje menüsünde Ayarlar ' ı tıklatın.
  2. Ayarlar için görünümde <a0>Project ayarları</a0> iletişim kutusunun, bağlantı hataları alma proje konfigürasyonu seçmek için tıklatın.
  3. Bağlantı sekmesinde Kategori birleşik giriş kutusunda Giriş seçmek için tıklatın.
  4. Kitaplıkları Yoksay kutusuna kitaplık adları (örneğin, Nafxcwd.lib;Libcmtd.lib) yerleştirin.

    Not Linker komut satırı eşdeğeri olarak /NOD: < kitaplığı adı >.
  5. Nesne/kitaplık modüllerini kutusuna kitaplığı adlarını ekleyin. Bu sırada ve ilk iki kitaplıkları (örneğin, Nafxcwd.lib Libcmtd.lib) satırında listelenen emin olmanız gerekir.
Visual C++ .NET bu seçeneği ayarlamak için <a0></a0>, çevrimiçi Yardım "Ayarı Visual C++ Proje Özellikleri" konusuna bakın.

Iki çözüm: Bulun ve modül sorunu için düzeltme

Geçerli kitaplığın bağlantı siparişini görüntülemek için <a0></a0>, aşağıdaki adımları izleyin:
  1. Proje menüsünde Ayarlar ' ı tıklatın.
  2. Ayarlar için görünümde <a0>Project ayarları</a0> iletişim kutusunun, bağlantı hataları alma proje konfigürasyonu seçmek için tıklatın.
  3. Bağlantı sekmesinde yazın / verbose: libProject seçenekleri kutusunda.
  4. Projenizi yeniden oluşturun. Kitaplıkları, bağlantı işlemi sırasında çıkış penceresinde listelenir.

Durum

Bu davranış tasarım yüzündendir.

Daha fazla bilgi

MFC kitaplıklarını kullandığınızda, CRT kitaplığı bağlı olduğu için önce bunlar bağlı emin olmanız gerekir. Her proje dosyasında Msdev\Mfc\Include\Afx.h içerdiğini sağlayarak bunu yapabilirsiniz (# include <Afx.h>) ilk, veya doğrudan veya dolaylı olarak (# include <Stdafx.h>). Afx.h dahil dosya zorlar doğru sırada kitaplıkların, # Pragma açıklama (lib, "<libname>") yönergesini kullanarak.

Kaynak dosya .c uzantılıdır veya dosya bir .cpp uzantısına sahiptir, ancak MFC kullanın, oluşturabilir ve küçük üstbilgisini modülünün üstünde (Forcelib.h) dosyası. Bu yeni başlığı thelibrary arama sırası do?ru oldu?undan emin olur.

Visual C++, bu üstbilgi dosyası içermiyor. Bu dosyayı oluşturmak için <a0></a0>, aşağıdaki adımları izleyin:
  1. Msdev\Mfc\Include\Afx.h açın.
  2. #Ifndef _AFX_NOFORCE_LIBS #endif arasındaki satırları seçin / /! _AFX_NOFORCE_LIBS.
  3. Seçimi Windows Panosu'na kopyalar.
  4. Yeni bir metin dosyası oluşturun.
  5. Pano içeriğini, bu yeni dosyaya yapıştırın.
  6. Dosyayı Msdev\Mfc\Include\Forcelib.h kaydedin.

Visual C++ .NET sorunu yeniden oluşturma adımları

  1. Microsoft Visual Studio .NET'i başlatın.
  2. Dosya menüsünde Yeni ' nin üzerine gelin ve sonra Project ' i tıklatın.
  3. Project Types altında Visual C++ Projects ' ı tıklatın ve şablonları altında MFC uygulaması ' ı tıklatın.
  4. Ad metin kutusuna Q148652 yazın.
  5. Konum metin kutusu, C:\Test yazın ve Tamam ' ı tıklatın.
  6. MFC Uygulaması Sihirbazı iletişim kutusunda, Uygulama türü ' nü tıklatın.
  7. Uygulama türü ' nün altında <a1>iletişim göre</a1> seçeneğini tıklatın tıklatın ve sonra Statik kitaplığındaki kullan MFCKullan MFC'ın altında.
  8. Son ' u tıklatın.
  9. Solution Explorer'da Kaynak dosyaları altında üç .cpp dosyaları seçin.
  10. Üç seçili dosyaları sağ tıklatın ve sonra da <a2>Kaldır</a2>'ı tıklatın.
  11. Ekle işaret kaynak dosyaları sağ tıklatın ve sonra Yeni Öğe Ekle'yi tıklatın.
  12. C++ dosyalarışablonları altında'ı tıklatın. Ad metin kutusuna, Aa yazın. ' ı tıklatın.
  13. Aa.cpp dosyasında aşağıdaki kodu yapıştırın:
    int test(){new int; return 1;}
  14. Ekle işaret Source Files ' ı sağ tıklatın ve sonra da Varolan öğesi Ekle'yi tıklatın.
  15. Aşağıdaki dosyaları seçin:
    • Q148652.cpp
    • Q148652Dlg.cpp
    • stdafx.cpp
  16. ' ı tıklatın.
  17. 15. Adımda seçtiğiniz dosyalar Kaynak dosyaları altında görüntülenir.
  18. Tüm dört .cpp dosyaları altında seçin kaynak dosyaları.
  19. Seçtiğiniz dört .cpp dosyaları sağ tıklatın ve sonra da Properties ' i tıklatın.
  20. Yapılandırma özellikleri ' ni genişletin ve sonra C/C++ ' ı genişletin.
  21. Üstbilgileri Precompiled ' ı tıklatın.
  22. Oluştur/kullan Precompiled üstbilgi kümesi Değil kullanarak Precompiled üstbilgileri özelliği. Tıklatın Tamam.
  23. Yapı) menüsünde tıklatın Rebuild Solution.

Özellikler

Makale numarası: 148652 - Last Review: 13 Mart 2008 Perşembe - Gözden geçirme: 7.1
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 4.1 Aboneliği
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Anahtar Kelimeler: 
kbmt kbsweptvs2008 kbtshoot kbarttypeinf kberrmsg kbprb KB148652 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:148652

Geri Bildirim Ver

 

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