Ошибка undefined reference
undefined reference to ... — ошибка не компилятора, а компоновщика (линкера): программы, которая на последнем шаге сборки собирает части программы в один исполняемый файл. Сообщение значит: функция (или переменная) объявлена — компилятор поверил, что она есть, и разрешил её вызвать, — но её тела при сборке не нашлось.
Выглядит это примерно так:
/usr/bin/ld: /tmp/ccA1b2C3.o: in function `main':
main.cpp:(.text+0x13): undefined reference to `sum(int, int)'
collect2: error: ld returned 1 exit statusВ Visual Studio та же ошибка называется LNK2019: unresolved external symbol (и следом LNK1120).
Что делать
Найдите в сообщении имя после undefined reference to — от него зависит решение.
Своя функциянет тела или файла
У функции нет тела или оно другое
Объявление без определения:
int sum(int a, int b); // объявление: «такая функция есть»Определение должно совпадать с объявлением полностью — имя (с учётом больших и маленьких букв) и типы параметров:
int sum(int a, int b) { // определение: тело функции
return a + b;
}Если объявлено sum(int, int), а написано sum(long long, long long) или Sum(int, int), для компоновщика это другая функция, и нужная остаётся без тела.
Второй файл не участвует в сборке
Функция может лежать в другом файле — например, объявление в utils.h, тело в utils.cpp, а вызов в main.cpp (там #include "utils.h" и вызов sum(2, 3)):
// utils.cpp
#include "utils.h"
int sum(int a, int b) {
return a + b;
}Тогда собирать нужно все .cpp файлы вместе:
g++ -std=c++17 -Wall -o prog main.cpp utils.cppКоманда g++ main.cpp без utils.cpp даст undefined reference to sum(int, int). В Code::Blocks и Visual Studio файл должен быть добавлен в проект: виден в списке файлов проекта, а не просто открыт в редакторе.
Шаблон в отдельном .cpp
Если функция объявлена с template (это шаблон — функция, написанная сразу для разных типов), её тело должно быть видно в месте вызова: шаблоны пишут целиком в заголовочном файле .h, а не делят на .h и .cpp.
main или WinMainнет главной функции
undefined reference to main (в Windows с MinGW — undefined reference to WinMain) значит, что в программе нет функции main. Частые причины:
- опечатка:
mian,Main,man; - файл с
mainне сохранён или не добавлен в проект; - собирается файл, в котором
mainи не должно быть, — например, толькоutils.cpp.
std::cout, operator new и другиесобрали через gcc
Если ошибок много и в них std::cout, std::ios_base::Init или operator new, программу на C++ собирали командой gcc. Она не подключает стандартную библиотеку C++. Собирайте через g++.
Функция внешней библиотекинужен ключ -l
Функции из внешних библиотек (не стандартной) требуют ключа -l с именем библиотеки. Ключи библиотек ставят после файлов программы: g++ main.cpp -o prog -lназвание. Какое имя нужно, написано в документации библиотеки.