Bağlayıcı Araçları Hatası LNK2001

çözülmemiş dış simge "simge"

Derlenen kod bir başvuru veya sembol çağrısı yapar. Sembol, bağlayıcı tarafından aranan hiçbir kitaplıkta veya nesne dosyasında tanımlanmamıştır.

Bu hata iletisinin ardından önemli hata LNK1120. Hata LNK1120 düzeltmek için önce tüm LNK2001 ve LNK2019 hatalarını düzeltin.

LNK2001 hataları almanın birçok yolu vardır. Bunların tümü, bağlayıcının çözümleyebildiği veya tanım bulabildiği bir işleve veya değişkene başvuru içerir. Derleyici, kodunuzun bir sembol bildirmediği zamanları belirleyebilir, ancak tanımlamadığında tanımlamaz. Bunun nedeni tanımın farklı bir kaynak dosya veya kitaplıkta olmasıdır. Kodunuz bir simgeye başvuruyorsa ancak hiç tanımlanmamışsa bağlayıcı bir hata oluşturur.

Çözülmemiş dış simge nedir?

Sembol, bir işlevin veya genel değişkenin iç adıdır. Bu, derlenmiş nesne dosyasında veya kitaplığında kullanılan veya tanımlanan adın biçimidir. Genel değişken, depolamanın ayrıldığı nesne dosyasında tanımlanır. İşlev, işlev gövdesi için derlenmiş kodun yerleştirildiği nesne dosyasında tanımlanır. Dış simge , bir nesne dosyasında başvurulur, ancak farklı bir kitaplıkta veya nesne dosyasında tanımlanır. Dışarı aktarılan simge, bunu tanımlayan nesne dosyası veya kitaplığı tarafından genel kullanıma sunulan simgedir .

Bir uygulama veya DLL oluşturmak için, kullanılan her simgenin bir tanımı olmalıdır. Bağlayıcı, her nesne dosyası tarafından başvuruda bulunılan her dış simgeyi çözümlemeli veya eşleşen tanımı bulmalıdır. Bağlayıcı, dış simgeyi çözemezse bir hata oluşturur. Bu, bağlayıcının bağlantılı dosyaların hiçbirinde eşleşen bir dışarı aktarılan simge tanımı bulamadı anlamına gelir.

Bu hata oluşabilir:

  • Projede bir kitaplığa (. LIB) veya nesne (. OBJ) dosyası. Bu sorunu çözmek için projenize gerekli kitaplık veya nesne dosyasına bir başvuru ekleyin. Daha fazla bilgi için bkz . bağlayıcı girişi olarak lib Dosyaları.

  • Projenin bir kitaplığa (. LIB) veya nesne (. OBJ) dosyasının başka bir kitaplıktan semboller gerektirmesi gerekir. Bağımlılığa neden olan işlevleri çağırmasanız bile bu durum oluşabilir. Bu sorunu çözmek için projenize diğer kitaplığa bir başvuru ekleyin. Daha fazla bilgi için bkz . Bağlama için klasik modeli anlama: Yolculuk için simgeleri alma.

  • /NODEFAULTLIB veya /Zl seçeneklerini kullanıyorsanız. Bu seçenekleri belirttiğinizde, gerekli kodu içeren kitaplıklar açıkça eklemediğiniz sürece projeye bağlanmaz. Bu sorunu çözmek için, bağlantı komut satırına kullandığınız tüm kitaplıkları açıkça ekleyin. Bu seçenekleri kullandığınızda birçok eksik CRT veya Standart Kitaplık işlev adı görürseniz, CRT ve Standart Kitaplık DLL'lerini veya kitaplık dosyalarını bağlantıya açıkça ekleyin.

  • /clr seçeneğini kullanarak derlerseniz. için eksik bir başvuru .cctorolabilir. Bu sorunu giderme hakkında daha fazla bilgi için bkz . Karma derlemeleri başlatma.

  • Bir uygulamanın hata ayıklama sürümünü oluştururken yayın modu kitaplıklarına bağlanırsanız. Benzer şekilde, /MTd veya /MDd seçeneklerini kullanıyorsanız ya da yayın kitaplıklarını tanımlayıp _DEBUG sonra bu kitaplıklara bağlantı verirseniz, diğer sorunların dışında birçok olası çözümlenmemiş dış kaynak bekleyebilirsiniz. Bir yayın modu derlemesini hata ayıklama kitaplıklarıyla bağlamak da benzer sorunlara neden olur. Bu sorunu çözmek için hata ayıklama derlemelerinizdeki hata ayıklama kitaplıklarını ve perakende derlemelerinizdeki perakende kitaplıklarını kullandığınızdan emin olun.

  • Kodunuz bir kitaplık sürümünden bir simgeye başvuruyorsa, ancak kitaplığın farklı bir sürümünü bağlarsanız. Genellikle, derleyicinin farklı sürümleri için oluşturulan nesne dosyalarını veya kitaplıkları karıştıramazsınız. Bir sürümde sevk edilen kitaplıklar, diğer sürümlerle birlikte gelen kitaplıklarda bulunmayan simgeler içerebilir. Bu sorunu çözmek için, derleyicinin aynı sürümüne sahip tüm nesne dosyalarını ve kitaplıklarını birbirine bağlamadan önce derleyin. Daha fazla bilgi için bkz . Visual Studio sürümleri arasında C++ ikili uyumluluğu.

  • Kitaplık yolları güncel değilse. Araç Seçenekleri Projeleri VC++ Dizinleri iletişim kutusu, Kitaplık dosyaları seçiminin altında kitaplık arama sırasını değiştirmenize olanak tanır.>>> Projenin Özellik Sayfaları iletişim kutusundaki Bağlayıcı klasörü, güncel olmayan yollar da içerebilir.

  • Yeni bir Windows SDK'sı yüklendiğinde (belki de farklı bir konuma). Kitaplık arama sırası, yeni konumu işaret eden şekilde güncelleştirilmelidir. Normalde, varsayılan Visual C++ konumunun önüne yeni SDK ekleme ve kitaplık dizinlerinin yolunu koymanız gerekir. Ayrıca, eklenmiş yollar içeren bir proje hala geçerli ancak güncel olmayan eski yollara işaret edebilir. Farklı bir konuma yüklenen yeni sürüm tarafından eklenen yeni işlevlere yönelik yolları güncelleştirin.

  • Komut satırında derleyip kendi ortam değişkenlerinizi oluşturduysanız. Araçlar, kitaplıklar ve üst bilgi dosyalarının yollarının tutarlı bir sürüme gittiğini doğrulayın. Daha fazla bilgi için bkz . Komut satırından MSVC araç takımını kullanma.

Kodlama sorunları

Bu hatanın nedeni:

  • Kaynak kodunuzda veya modül tanımı (.def) dosyanızda eşleşmeyen durum. Örneğin, bir C++ kaynak dosyasındaki bir değişkeni var1 adlandırıp başka bir dosyada olduğu gibi VAR1 erişmeye çalışırsanız, bu hata oluşturulur. Bu sorunu çözmek için tutarlı bir şekilde yazılmış ve büyük/küçük harfe yazılmış adlar kullanın.

  • İşlev inlining kullanan bir proje. İşlevleri üst bilgi dosyası yerine kaynak dosyada olarak inline tanımladığınızda oluşabilir. Çizili işlevler, bunları tanımlayan kaynak dosyanın dışında görülemez. Bu sorunu çözmek için, bildirildiği üst bilgilerde iç işlevler tanımlayın.

  • C işlevi için bir bildirim kullanmadan extern "C" bir C++ programından C işlevi çağırma. Derleyici, C ve C++ kodu için farklı iç simge adlandırma kuralları kullanır. İç simge adı, bağlayıcının sembolleri çözümlerken arayıcının baktığı addır. Bu sorunu çözmek için, C++ kodunuzda kullanılan tüm C işlevlerinin bildirimlerini kapsayan bir extern "C" sarmalayıcı kullanın ve bu da derleyicinin bu simgeler için C iç adlandırma kuralını kullanmasına neden olur. Derleyici seçenekleri /Tp ve /Tc , dosya adı uzantısı ne olursa olsun derleyicinin dosyaları sırasıyla C++ veya C olarak derlemesine neden olur. Bu seçenekler iç işlev adlarının beklediğinizden farklı olmasını sağlayabilir.

  • Dış bağlantısı olmayan işlevlere veya verilere başvurma girişimi. C++'ta, açıkça olarak externbelirtilmediği sürece satır içi işlevlerin ve const verilerin iç bağlantısı vardır. Bu sorunu çözmek için, tanım kaynak dosyasının dışında başvuruda bulunılan sembollerde açık extern bildirimleri kullanın.

  • Eksik işlev gövdesi veya değişken tanımı. Bu hata, kodunuzda değişkenleri, işlevleri veya sınıfları tanımlamadığınızda sık karşılaşılan bir durumdur. Derleyicinin hatasız bir nesne dosyası oluşturmak için yalnızca işlev prototipine veya extern değişken bildirimine ihtiyacı vardır, ancak işlev kodu veya değişken alanı ayrılmış olmadığından bağlayıcı işlev çağrısı veya değişken başvurusu çözümleyemez. Bu sorunu çözmek için, bağlandığınız bir kaynak dosya veya kitaplıkta başvuruda bulunılan her işlevi ve değişkeni tanımladığınızdan emin olun.

  • dönüş ve parametre türlerini veya işlev tanımındakilerle eşleşmeyen çağırma kurallarını kullanan bir işlev çağrısı. C++ nesne dosyalarında Name decoration, çağırma kuralını, sınıfını veya ad alanı kapsamını ve işlevin dönüş ve parametre türlerini kodlar. Kodlanmış dize, son dekore edilmiş işlev adının bir parçası olur. Bu ad bağlayıcı tarafından diğer nesne dosyalarından işleve yapılan çağrıları çözümlemek veya eşleştirmek için kullanılır. Bu sorunu çözmek için işlev bildirimi, tanımı ve çağrılarının tümünün aynı kapsamları, türleri ve çağırma kurallarını kullandığından emin olun.

  • Çağırdığınız C++ kodu, bir sınıf tanımına işlev prototipi eklediğinizde, ancak işlevin uygulanmasını dahil etmeyin. Bu sorunu çözmek için çağırdığınız tüm sınıf üyeleri için bir tanım sağladığınıza emin olun.

  • Soyut bir temel sınıftan saf sanal işlevi çağırma girişimi. Saf bir sanal işlevin temel sınıf uygulaması yoktur. Bu sorunu düzeltmek için, tüm sanal işlevlerin uygulandığına emin olun.

  • bu işlevin kapsamı dışında bir işlev (yerel değişken) içinde bildirilen bir değişken kullanılmaya çalışılıyor. Bu sorunu çözmek için kapsamda olmayan değişkene başvuruyu kaldırın veya değişkeni daha yüksek bir kapsama taşıyın.

  • ATL projesinin Yayın sürümünü oluşturduğunuzda, CRT başlangıç kodunun gerekli olduğunu belirten bir ileti oluşturursunuz. Bu sorunu çözmek için aşağıdakilerden birini yapın:

    • Önişlemci listesinden kaldır _ATL_MIN_CRT , CRT başlangıç kodunun eklenmesine izin vermek için tanımlar. Daha fazla bilgi için bkz . Genel özellik sayfası (Proje).

    • Mümkünse, CRT başlangıç kodu gerektiren CRT işlevlerine yapılan çağrıları kaldırın. Bunun yerine Win32 eşdeğerlerini kullanın. Örneğin, yerine strcmpkullanınlstrcmp. CRT başlangıç kodu gerektiren bilinen işlevler, dize ve kayan nokta işlevlerinden bazılarıdır.

Tutarlılık sorunları

Şu anda derleyici satıcıları arasında ve hatta aynı derleyicinin farklı sürümleri arasında C++ ad dekorasyonu standardı yoktur. Farklı derleyicilerle derlenen nesne dosyaları aynı adlandırma düzenini kullanmayabilir. Bunları bağlamak hata LNK2001 neden olabilir.

Farklı modüllerde satır içi ve satır içi olmayan derleme seçeneklerinin karıştırılması LNK2001 neden olabilir. İşlev satır içi oluşturma açık (/Ob1 veya /Ob2) ile bir C++ kitaplığı oluşturulduysa ancak işlevleri açıklayan ilgili üst bilgi dosyasında satır içi kapatma (anahtar sözcük yok inline ) varsa, bu hata oluşur. Bu sorunu çözmek için, diğer kaynak dosyalara eklediğiniz üst bilgi dosyasındaki işlevleri inline tanımlayın.

Derleyici yönergesini #pragma inline_depth kullanıyorsanız, 2 veya daha büyük bir değer ayarladığınızdan emin olun ve /Ob1 veya /Ob2 derleyici seçeneğini de kullandığınızdan emin olun.

Yalnızca kaynak DLL'sini oluştururken /NOENTRY LINK seçeneğini atlarsanız bu hata oluşabilir. Bu sorunu çözmek için bağlantı komutuna /NOENTRY seçeneğini ekleyin.

Projenizde yanlış /SUBSYSTEM veya /ENTRY ayarları kullanırsanız bu hata oluşabilir. Örneğin, bir konsol uygulaması yazar ve /SUBSYSTEM:WINDOWS belirtirseniz, için WinMainçözümlenmemiş bir dış hata oluşturulur. Bu sorunu çözmek için seçenekleri proje türüyle eşleştirdiğinizden emin olun. Bu seçenekler ve giriş noktaları hakkında daha fazla bilgi için /SUBSYSTEM ve /ENTRY bağlayıcı seçeneklerine bakın.

Dışarı aktarılan .def dosyası simgesi sorunları

Bu hata, bir .def dosyasında listelenen dışarı aktarma bulunamadığında oluşur. Bunun nedeni dışarı aktarmanın mevcut olmaması, yanlış yazılması veya C++ ile düzenlenmiş adlar kullanması olabilir. .def dosyası süslü adlar almaz. Bu sorunu çözmek için gereksiz dışarı aktarmaları kaldırın ve dışarı aktarılan simgeler için bildirimleri kullanın extern "C" .

Hatayı bulmak için süslü adı kullanın

C++ derleyicisi ve bağlayıcısı name-mangling olarak da bilinen Name Decoration'ı kullanır. Ad dekorasyonu, simge adında bir değişkenin türü hakkında ek bilgiler kodlar. İşlevin simge adı dönüş türünü, parametre türlerini, kapsamını ve çağırma kuralını kodlar. Bu süslü ad, bağlayıcının dış simgeleri çözümlemek için arayıcının aramasını arayarak simge adıdır.

Bir işlev veya değişkenin bildirimi işlevin veya değişkenin tanımıyla tam olarak eşleşmediyse bağlantı hatası oluşabilir. Bunun nedeni, herhangi bir farkın eşleşecek sembol adının bir parçası olmasıdır. Aynı üst bilgi dosyası hem çağıran kodda hem de tanımlama kodunda kullanılıp kullanılmasa bile hata oluşabilir. Bunun bir yolu, kaynak dosyaları farklı derleyici bayrakları kullanarak derlemenizdir. Örneğin, kodunuz çağırma kuralını kullanacak __vectorcall şekilde derlenmişse, ancak istemcilerin varsayılan __cdecl veya __fastcall çağırma kuralını kullanarak çağırmasını bekleyen bir kitaplığa bağlanıyorsanız. Bu durumda, çağırma kuralları farklı olduğundan simgeler eşleşmiyor.

Nedeni bulmanıza yardımcı olması için, hata iletisi adın iki sürümünü gösterir. Hem "kolay ad" hem de kaynak kodunda kullanılan adı ve süslü adı (parantez içinde) görüntüler. Süslü adı nasıl yorumlayabileceğinizi bilmeniz gerekmez. Yine de arama yapabilir ve diğer süslü adlarla karşılaştırabilirsiniz. Komut satırı araçları, beklenen simge adını ve gerçek simge adını bulup karşılaştırmaya yardımcı olabilir:

  • DUMPBIN komut satırı aracının /EXPORTS ve /SYMBOLS seçenekleri burada kullanışlıdır. .dll ve nesne veya kitaplık dosyalarınızda hangi simgelerin tanımlandığını bulmanıza yardımcı olabilir. Dışarı aktarılan süslü adların bağlayıcının arama yaptığı süslü adlarla eşleştiğinden emin olmak için simgeler listesini kullanabilirsiniz.

  • Bazı durumlarda bağlayıcı yalnızca simgenin süslü adını bildirebilir. UnDNAME komut satırı aracını kullanarak dekore edilmiş bir adın dekorasyonsuz biçimini alabilirsiniz.

Ek kaynaklar

Daha fazla bilgi için "Tanımsız başvuru/çözümlenmemiş dış simge hatası nedir ve bunu nasıl düzeltebilirim?" sorusuna bakın.