Như tên gọi, một ký hiệu bạn khai báo nhưng chưa định nghĩa. Lỗi này xảy ra do nhiều nguyên nhân, dưới đây là 3 trường hợp phổ biến:
Quên định nghĩa tên đã khai báo. Ví dụ: khai báo hàm trong file, sử dụng nó ở đâu đó nhưng không cung cấp định nghĩa.
#include <iostream> void foo(); int main() { foo(); // Khai báo nhưng không định nghĩa }Định nghĩa nhưng không dùng tên đầy đủ (qualified name). Tạo lớp với phương thức, định nghĩa phương thức đó nhưng quên dùng toán tử phân giải phạm vi để liên kết hàm với định nghĩa.
#include <iostream> class A { void foo(); }; void foo() { } // Nên dùng A::foo int main() { A a; a.foo(); // Chưa định nghĩa! }Thứ tự liên kết (linker) không đúng. Linker thử liên kết theo thứ tự bạn chỉ định. Nếu bạn sử dụng phương thức trước khi nó được định nghĩa, có thể gặp lỗi này.
Không thể liệt kê hết tất cả nguyên nhân. Bạn có thể tham khảo danh sách chi tiết tại Stack Overflow.