Движок с нуля
Справочник

Объектный файл

Результат компиляции одного .cpp: файл .obj с машинными командами. Это ещё не программа: в файле .obj есть ссылки на функции, код которых лежит в других файлах.

Компилятор переводит каждый .cpp отдельно и для каждого пишет свой .obj: из main.cpp получается main.obj. Внутри — машинные команды твоих функций и список того, чего не хватает: «здесь используется std::cout, где его код — не знаю».

Запустить .obj нельзя. Сначала линкер соберёт все .obj и библиотеки в один исполняемый файл.

Зачем такой промежуточный шаг: в движке будут сотни .cpp. Поменял один — перекомпилируется только этот файл, а остальные .obj уже готовы. Линковка быстрая, и программа пересобирается за секунды, а не за минуты.