Для чого використовуються папки obj і bin (створені Visual Studio)?


222

Я створив новий проект в Visual Studio 2010 і зауважив , що в даний час існує дві нові папки з ім'ям objі binв моїй директорії проекту.

Подібна пара папок створюється при складанні та налагодженні - для чого ці папки?

Відповіді:


238

У objпапці містяться об'єктивні або проміжні файли , які є компільованими бінарними файлами, які ще не пов'язані. Вони по суті є фрагментами, які будуть об'єднані для отримання остаточного виконуваного файлу. Компілятор генерує один об’єктний файл для кожного вихідного файлу, і ці файли поміщаються в objпапку.

У binпапці містяться двійкові файли , які є фактичним виконуваним кодом для вашої програми чи бібліотеки.

Кожна з цих папок підрозділяються на Debugі Releaseпапки, які просто відповідають конфігурації збірки проекту. Розглянуті вище два типи файлів поміщаються у відповідну папку, залежно від того, який тип складання ви виконуєте. Це дозволяє вам легко визначити, які виконувані файли створені за допомогою налагоджувальних символів, а які були створені з увімкненими оптимізаціями та готовими до випуску.

Зауважте, що ви можете змінити, де Visual Studio видає ваші виконувані файли під час компіляції у Властивості вашого проекту. Ви також можете змінити імена та вибрані параметри для своїх конфігурацій побудови.


4
З будь-якої причини мій проект не має налагодження чи випуску підпапки для папок obj та bin. Якщо я редагую свої параметри проекту для збирання в підпапці налагодження / випуску залежно від поточно вибраної конфігурації, я отримую помилку, що тип даних не вдалося створити під час налагодження програми. Моя програма лише коли-небудь дивиться в папку bin для dlls і ніколи не знає, чи шукати в папці налагодження чи випуску. Як це виправити?
Аніл Ната

3
@Sly я не розумію, про що ти питаєш. Проект будує або додаток (EXE), або бібліотеку (DLL). Він не може побудувати і те і інше. Отже, якщо ваш проект створює додаток, він не розміщуватиме жодних DLL-файлів у вашій папці біна. І якщо ваш проект створить бібліотеку, ви отримаєте помилку при спробі налагодження, оскільки ви не можете виконати DLL. У будь-якому випадку це здається, що ви змінили шлях виводу за замовчуванням у властивостях вашого проекту. Якщо вам потрібна додаткова допомога, поставте нове запитання. Не забудьте добре задокументувати проблему, включаючи скріншоти конфігурації вашого проекту, якщо це необхідно.
Коді Грей

2
Цікаво, чи можу я змусити візуальну студію видалити папку obj після того, як збірка буде примусовою?
Johnny_D

2
@SlyRaskal Однією з причин, чому у вас не може бути папок налагодження / випуску, є розробка веб-проекту?
Тім Ілз

2
Чи objдійсно містять лише непов'язані файли коду об'єкта? З мого досвіду, вони містять усі вони, і на завершальному етапі збирання файли, що входять до "остаточного набору", копіюються в bin.
ivan_pozdeev

44

Я б закликав вас переглянути це відео на YouTube, яке демонструє різницю між папками C # bin та obj а також пояснює, як ми отримуємо перевагу від додаткової / умовної компіляції.

Компіляція C # - це двоетапний процес, докладнішу інформацію див. Нижче.

  1. Компіляція: Під час компіляції окремі файли коду C # складаються в окремі компільовані одиниці. Ці окремі складені файли коду переходять у каталог OBJ.
  2. Зв'язування: На етапі з'єднання ці індивідуальні компільовані файли коду пов'язані для створення єдиного блоку DLL та EXE Це йде в каталог BIN.

Папки C # bin vs obj

Якщо порівнювати і каталог bin та obj, ви знайдете більшу кількість файлів у каталозі "obj", оскільки в ньому є окремі складені файли коду, тоді як "bin" має єдину одиницю.

bin vs obj


20

objКаталог для проміжних об'єктних файлів і інших тимчасових файлів даних, які генеруються системою компілятора або збірки в процесі побудови. ThebinКаталог каталог, кінцеві вихідні файли (і будь-які залежності або інші розгорнутих файли) будуть записані.

Якщо ви хочете, ви можете змінити фактичні каталоги, які використовуються для обох цілей у налаштуваннях проекту.


"bin" можна змінити у властивостях проекту -> "Build" -> "Output" -> "Output path". А як щодо "obj"?
Пітер Мортенсен

5

Один цікавий факт про каталог obj: Якщо ви розмістили публікацію у веб-проекті, файли, які будуть опубліковані, ставляться до obj \ Release \ Package \ PackageTmp. Якщо ви хочете опублікувати файли самостійно, а не використовувати інтегровану функцію VS, ви можете захопити файли, які вам фактично потрібно розгорнути тут, а не пробирати всі цифрові сміття в каталозі бін.


0

Будьте обережні з setupпроектами, якщо ви їх використовуєте; Проекти налаштування Visual Studio Primary Outputвитягуються з objпапки, а не зbin .

Я випускав програми, які, на мою думку, були затуманені та підписані в msiналаштуваннях досить довгий час, перш ніж я виявив, що розгорнуті файли додатків насправді не були затуманені та не підписані, як я виконую процедуру після збирання на binскладах папок і повинен був орієнтуватися наobj папку замість цього збірки.

Це далеко не інтуїтивно зрозуміло, але загальним setupпідходом є використання Primary Outputпроекту, і це objпапка. Мені б подобалося, якби хтось міг пролити світло на цю дорогу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.