Объектные файлы (файлы, хранящиеся в Obj) - это скомпилированные двоичные файлы, которые не были связаны. Думайте об этом как о фрагментах окончательного исполняемого файла, которые впоследствии будут объединены для создания вашего исполняемого файла.
При компиляции исходного кода каждый исходный файл будет свободно компилироваться в один объектный файл. Зачем? Без причины *, просто как был написан ваш конкретный компилятор. Есть другие компиляторы на других языках, которые не делают этого, но вместо этого компилируют все в один большой двоичный файл за один шаг. Но люди, написавшие ваш компилятор, решили сначала скомпилировать отдельные объектные файлы.
Теперь вы можете себе представить, что если каждый исходный файл генерирует один объектный файл, то каждый раз, когда вы компилируете код, ваша исходная директория будет грязной и заполнена большим количеством файлов .obj (и действительно, многие компиляторы Си традиционно этот). Со временем разработчики, работающие над большими проектами, начали писать сценарий компиляции или настраивать свои проекты для сбора всех файлов .obj в один каталог, чтобы сделать исходный каталог менее беспорядочным.
Людям, написавшим ваш компилятор, очевидно, понравилась идея отдельного каталога Obj, поэтому они сделали его конфигурацией проектов по умолчанию. Что касается того, почему существует подкаталог x86, потому что ваш компилятор также поддерживает другие процессоры, такие как ARM (для Android, Win Phone 7 и iPhone), а также различает 32-битные и 64-битные.
* примечание: на самом деле есть несколько очень веских причин для этого, в том числе сделать код компилятора более модульным и поддерживать пошаговую компиляцию, но тот факт, что некоторые люди могут делать все это без генерации отдельных файлов obj, означает В основном это дизайнерское решение разработчиков компилятора, а не необходимость.