Selama pengkodean di Visual Studio saya mendapat kesalahan simbol eksternal yang tidak terselesaikan dan saya tidak tahu harus berbuat apa. Saya tidak tahu apa yang salah. Bisakah Anda menguraikan saya? Di mana saya harus mencari kesalahan apa?
1>Form.obj : error LNK2019: unresolved external symbol "public: class Field * __thiscall Field::addField(class Field *)" (?addField@Field@@QAEPAV1@PAV1@@Z) referenced in function "public: void __thiscall Form::parse(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (?parse@Form@@QAEXAAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>Form.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall Field::parse(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (?parse@Field@@UAEXAAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function "public: __thiscall InputField::InputField(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (??0InputField@@QAE@AAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Field::prompt(void)" (?prompt@Field@@UAEXXZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Field::getName(void)" (?getName@Field@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Field::getType(void)" (?getType@Field@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Field::describe(void)" (?describe@Field@@UAEXXZ)
1>C:\Users\tomy\Documents\Visual Studio 2010\Projects\zapoctovkac++\Debug\zapoctovkac++.exe : fatal error LNK1120: 6 unresolved externals
c++
visual-studio
visual-c++
unresolved-external
Novellizator
sumber
sumber
void myFunc() { /* do stuff */ }
Alih-alih ini (kanan):void A::myFunc() { /* do stuff */ }
void myFunc() {};
.Jawaban:
Kesalahan ini sering berarti bahwa beberapa fungsi memiliki deklarasi, tetapi bukan definisi.
Contoh:
Dalam kasus Anda, definisi tidak dapat ditemukan. Masalahnya mungkin Anda menyertakan file header, yang membawa beberapa deklarasi fungsi, tetapi Anda juga:
Kesalahan umum adalah Anda mendefinisikan fungsi sebagai mandiri dan melupakan pemilih kelas, misalnya
A::
, dalam file .cpp Anda :Salah:
void myFunc() { /* do stuff */ }
kanan:
void A::myFunc() { /* do stuff */ }
sumber
void myFunc() {}
bukanA::void myFunc() {}
.Periksa apakah Anda menyertakan semua file sumber dalam solusi yang Anda rujuk.
Jika Anda tidak menyertakan file sumber (dan dengan demikian implementasinya) untuk kelas
Field
dalam proyek Anda, itu tidak akan dibangun dan Anda tidak akan dapat menautkan selama kompilasi.Atau, mungkin Anda menggunakan perpustakaan statis atau dinamis dan lupa memberi tahu tautan tentang tautan
.lib
?sumber
Tampaknya ada perpustakaan yang hilang atau termasuk, Anda dapat mencoba mencari tahu kelas perpustakaan Anda yang memiliki getName, getType dll ... dan memasukkannya ke dalam file header atau menggunakan
#include
.Juga jika ini berasal dari perpustakaan eksternal, pastikan Anda merujuknya pada file proyek Anda. Misalnya, jika kelas ini milik abc.lib maka di Visual Studio Anda
sumber
Saya baru saja melihat masalah saya tidak bisa memanggil fungsi dari utama dalam file .cpp, dinyatakan dengan benar dalam file .h dan didefinisikan dalam file .c. Mengalami kesalahan tautan. Sementara itu saya dapat memanggil fungsi dari file .c biasa. Mungkin itu tergantung pada konvensi panggilan. Solusi adalah menambahkan baris preproc berikut di setiap file .h:
dan ini pada akhirnya
sumber
Saya memiliki kesalahan ketika proyek saya dikompilasi sebagai proyek x64 . dan saya telah menggunakan Perpustakaan yang dikompilasi sebagai x86 .
Saya telah mengkompilasi ulang pustaka sebagai x64 dan menyelesaikannya.
sumber
kadang-kadang jika file header baru ditambahkan, dan kesalahan ini mulai terjadi karena itu, Anda perlu menambahkan perpustakaan juga untuk menyingkirkan
unresolved external symbol
.sebagai contoh:
akan membutuhkan:
sumber
Saya memiliki kesalahan tautan yang sama, tetapi dari proyek uji yang mereferensikan dll lain. Mengetahui bahwa setelah menambahkan
_declspec(dllexport)
di depan setiap fungsi yang ditentukan dalam pesan kesalahan, tautannya berfungsi dengan baik.sumber
Saya percaya sebagian besar poin tentang penyebab dan solusi telah dibahas oleh semua kontributor di utas ini. Saya hanya ingin menunjukkan untuk masalah 'eksternal yang belum terselesaikan', itu disebabkan oleh tipe data yang didefinisikan sebagai makro yang diganti secara berbeda dari yang diharapkan, yang menghasilkan tipe yang salah yang dipasok ke fungsi yang dimaksud, dan karena fungsi dengan tipe tidak pernah ditentukan, itu tidak bisa diselesaikan. Secara khusus, di bawah C / C ++ -> Bahasa, ada atribut yang disebut 'Treat WChar_t As Built in Type, yang seharusnya didefinisikan sebagai' No (/ Zc: wchar_t-) 'tetapi tidak dalam kasus saya.
sumber
Selain jawaban yang sangat baik oleh Chris Morris di atas, saya menemukan cara yang sangat menarik Anda dapat menerima kesalahan yang sama ini jika Anda memanggil metode virtual yang belum diatur ke murni tetapi tidak implementasinya sendiri. Ini adalah alasan yang persis sama (kompiler tidak dapat menemukan implementasi metode dan karenanya penjahat), tetapi IDE saya tidak menangkap kesalahan ini sedikit pun.
misalnya, kode berikut akan mendapatkan kesalahan kompilasi dengan pesan kesalahan yang sama:
Namun, mengubah IamInterface myFunc () menjadi metode virtual murni (metode yang "harus" diterapkan, bahwa daripada metode virtual yang merupakan metode yang "dapat" diganti) akan menghilangkan kesalahan kompilasi.
Berharap ini membantu orang StackOverFlow berikutnya melangkah melalui kode!
sumber
Lihat Kesalahan Alat Tautan LNK2019 di MSDN, ia memiliki daftar terperinci masalah umum yang menyebabkan LNK2019.
sumber
Pastikan Anda menghias file header Anda dengan
Hal-hal buruk - termasuk ini - dapat terjadi jika Anda tidak melakukannya
sumber
#pragma once
?Namun masalah lain yang mungkin terjadi (bahwa saya baru saja menggaruk-garuk kepala selama beberapa waktu):
Jika Anda mendefinisikan fungsi Anda sebagai
inline
, mereka — tentu saja! —Telah didefinisikan di header (atau file inline ), bukan cpp .Dalam kasus saya, mereka berada dalam file inline, tetapi hanya karena mereka adalah implementasi platform spesifik, dan cpp termasuk file inl yang sesuai ini ... bukan header. Ya, itu tidak terjadi.
Saya pikir saya akan meninggalkan ini di sini juga, mungkin orang lain mengalami masalah yang sama dan menemukannya di sini.
sumber
Saya hanya mengalami kesulitan dengan ini. Semuanya diatur secara logis. Saya menyatakan konstruktor tetapi tidak mendefinisikannya
Aku hampir membenturkan kepalaku ke keyboard ketika aku lupa sesuatu yang begitu mendasar.
sumber
Saya melakukan beberapa C ++ untuk pertama kalinya dalam waktu yang lama, dan saya mendapatkan kesalahan ini ketika saya lupa menambahkan awalan ClassName :: untuk definisi fungsi, karena ini sedikit unik untuk C ++. Jadi ingatlah untuk memeriksanya juga!
sumber
Salah satu kemungkinan penyebab kesalahan penghubung ini juga bisa berupa
inline
fungsi yang dideklarasikan tetapi tidak didefinisikan dalam file header yang kemudian disertakan di tempat lain. Fungsi sebaris harus didefinisikan di setiap unit terjemahan tempat mereka digunakan.sumber
POINTER
Saya punya masalah ini dan menyelesaikannya dengan menggunakan pointer. Saya melihat bahwa ini bukan masalah Anda, tetapi saya pikir saya akan menyebutkannya karena saya berharap hal itu ada di sini ketika saya melihatnya satu jam yang lalu. Masalah saya adalah tentang mendeklarasikan variabel anggota statis tanpa mendefinisikannya (definisi perlu muncul setelah beberapa pengaturan lainnya) dan tentu saja pointer tidak memerlukan definisi. Kesalahan yang sama mendasarnya: P
sumber
Masalah saya adalah naskah tidak memiliki
cpp
file yang ditentukan di dalamnya. Ini bisa sangat membingungkan karena Visual Studio memilikicpp
file dalam proyek tetapi sesuatu yang lain sama sekali sedang dibangun.sumber
Masalah saya adalah: Saya harus melakukan deklarasi maju kelas yang ctornya adalah "eksternal yang belum terselesaikan".
Dalam file tempat saya mendapatkan kesalahan, saya harus meletakkan sesuatu seperti ini:
Tentu saja, proyek saya jauh lebih rumit dan ini hanyalah contoh cuplikan. Juga saat menggunakan ruang nama, deklarasikan juga .
sumber
Hanya menghabiskan beberapa jam untuk menemukan bahwa masalahnya adalah file utama saya memiliki ekstensi,
.c
bukan.cpp
:/
sumber
Namun kemungkinan lain untuk memeriksa, itu adalah masalah saya saat ini.
Saya telah menambahkan fungsi ke perpustakaan, dan termasuk folder keluaran perpustakaan di jalur pencarian.
Tapi saya juga punya folder dengan versi lama dari perpustakaan yang terdaftar sebelumnya, jadi VS menggunakan perpustakaan lama, dan tentu saja tidak menemukan fungsi baru.
sumber
Pastikan Anda tidak mencoba membebani operator penyisipan atau ekstraksi sebagai fungsi inline. Saya memiliki masalah ini dan hanya hilang ketika saya menghapus kata kunci itu.
sumber
Apa yang menyebabkannya dalam kasus saya:
Saya punya file besar
Foo.cpp
tanpa Foo.h.Foo.cpp
mulai seperti ini:Saya menghapus kata kunci "statis" dan menambahkan
Foo.h
dengan ini:Apakah Anda melihat kesalahannya?
Saya benar-benar merindukan var yang awalnya didefinisikan dalam namespace, karena deklarasi namespace dikubur dalam kode lain. Cara mengatasinya adalah mengubah extern seperti ini:
sumber
Alasan yang mungkin untuk kesalahan "Simbol eksternal yang tidak terselesaikan" dapat berupa konvensi pemanggilan fungsi.
Pastikan bahwa semua file sumber menggunakan standar yang sama (.c atau .cpp), atau tentukan konvensi pemanggilan.
Kalau tidak, jika satu file adalah file C (source.c) dan file lain adalah file .cpp, dan mereka menautkan ke header yang sama, maka kesalahan "simbol eksternal yang tidak terselesaikan" akan dibuang, karena fungsi pertama kali didefinisikan sebagai fungsi C cdecl, tetapi kemudian file C ++ menggunakan header yang sama akan mencari fungsi C ++.
Untuk menghindari "Kesalahan simbol eksternal yang tidak terselesaikan", pastikan bahwa konvensi pemanggilan fungsi tetap sama di antara file yang menggunakannya.
sumber
Saya datang ke sini mencari penjelasan yang mungkin sebelum melihat lebih dekat pada baris sebelum kesalahan linker. Ternyata telah menjadi executable tambahan yang tidak memiliki deklarasi global!
sumber
Saya baru saja mengalami kesalahan yang sama dan saya berhasil menghindarinya dengan mengganti
;
dengan{}
di file header.Ketika itu
void xyzMethod();
tidak mau dikompilasi.sumber