Источник: здесь
"Связывание относится к созданию одного исполняемого файла из нескольких объектных файлов. На этом этапе, как правило, компоновщик будет жаловаться на неопределенные функции (обычно саму main). Во время компиляции, если компилятор не может найти определение для конкретной функции, это просто предполагает, что функция была определена в другом файле. Если это не так, компилятор не узнает об этом - он не смотрит на содержимое более одного файла за раз. Компоновщик, с другой стороны, может просматривать несколько файлов и пытаться найти ссылки на функции, которые не были упомянуты. "
Другими словами: связывание объединяет все ваши скомпилированные библиотеки / двоичные файлы, которые зависят друг от друга, так что выполнение вашей программы будет возможным.