A cosa servono le cartelle obj e bin (create da Visual Studio)?


222

Ho creato un nuovo progetto in Visual Studio 2010 e ho notato che ora ci sono due nuove cartelle denominate obje binnella directory del mio progetto.

Una coppia simile di cartelle viene creata durante la creazione e il debug: a cosa servono queste cartelle?

Risposte:


238

La objcartella contiene file oggetto o intermedi, che sono file binari compilati che non sono ancora stati collegati. Sono essenzialmente frammenti che verranno combinati per produrre l'eseguibile finale. Il compilatore genera un file oggetto per ciascun file di origine e tali file vengono inseriti nella objcartella.

La bincartella contiene file binari , che sono il codice eseguibile effettivo per l'applicazione o la libreria.

Ognuna di queste cartelle è ulteriormente suddivisa in Debuge Releasecartelle, che corrispondono semplicemente alle configurazioni di build del progetto. I due tipi di file discussi sopra sono collocati nella cartella appropriata, a seconda del tipo di build che esegui. Ciò semplifica la determinazione dei file eseguibili creati con i simboli di debug e quali sono stati creati con le ottimizzazioni abilitate e pronte per il rilascio.

Si noti che è possibile modificare la posizione in cui Visual Studio genera i file eseguibili durante una compilazione nelle Proprietà del progetto. Puoi anche cambiare i nomi e le opzioni selezionate per le tue configurazioni di build.


4
Per qualsiasi motivo, il mio progetto non ha una sottocartella di debug o di rilascio per le cartelle obj e bin. Se modifico le impostazioni del mio progetto per compilare la sottocartella debug / release in base alla configurazione attualmente selezionata, viene visualizzato un messaggio di errore che indica che il tipo di dati non può essere creato durante il debug dell'applicazione. La mia app cerca sempre e solo le cartelle bin nella cartella bin e non sa mai di cercare nella cartella debug o release. Come posso correggere questo?
Anil Natha,

3
@Sly Non capisco cosa stai chiedendo. Un progetto crea un'applicazione (EXE) o una libreria (DLL). Non può costruire entrambi. Pertanto, se il progetto crea un'applicazione, non inserirà alcuna DLL nella cartella bin. E se il tuo progetto crea una libreria, riceverai un errore quando proverai a eseguire il debug perché non puoi eseguire una DLL. Ad ogni modo, sembra che tu abbia cambiato il percorso di output predefinito nelle proprietà del tuo progetto. Se hai bisogno di ulteriore aiuto, fai una nuova domanda. Assicurati di documentare bene il problema, inclusi gli screenshot della configurazione del tuo progetto, se necessario.
Cody Grey

2
Mi chiedo se posso forzare Visual Studio a eliminare la cartella obj dopo che la compilazione è stata forzata?
Johnny_D,

2
@SlyRaskal Uno dei motivi per cui potresti non avere le cartelle Debug / Release è se stai sviluppando un progetto web?
Tim Iles,

2
Fa objdavvero contenere solo non collegate file di codice oggetto? Dalla mia esperienza, che contiene tutto di loro, e al passaggio di generazione finale, i file che fanno parte del "set finale" vengono copiati in bin.
Ivan_pozdeev,

44

Vorrei incoraggiarvi a vedere questo video di YouTube che dimostra la differenza tra le cartelle C # bin e obj e spiega anche come trarre vantaggio dalla compilazione incrementale / condizionale.

La compilazione C # è un processo in due passaggi, vedere il diagramma seguente per maggiori dettagli:

  1. Compilazione: in fase di compilazione i singoli file di codice C # vengono compilati in singole unità compilate. Questi singoli file di codice compilati vanno nella directory OBJ.
  2. Collegamento: Nella fase di collegamento questi singoli file di codice compilati sono collegati per creare una singola unità DLL ed EXE. Questo va nella directory BIN.

Cartelle C # bin vs obj

Se si confrontano sia la directory bin che quella obj, nella directory "obj" si troverà un numero maggiore di file poiché ha singoli file di codice compilati mentre "bin" ha una singola unità.

bin vs obj


20

La objdirectory è per file di oggetti intermedi e altri file di dati transitori che vengono generati dal compilatore o dal sistema di compilazione durante una compilazione. La bindirectory è la directory in cui verranno scritti i file binari di output finali (e tutte le dipendenze o altri file distribuibili).

Se lo desideri, puoi modificare le directory effettive utilizzate per entrambi gli scopi all'interno delle impostazioni del progetto.


"bin" può essere modificato nelle proprietà del progetto -> "Build" -> "Output" -> "Percorso di output". Ma che dire di "obj"?
Peter Mortensen,

5

Un fatto interessante sulla directory obj: se la pubblicazione è stata impostata in un progetto Web, i file che verranno pubblicati vengono messi in scena in obj \ Release \ Package \ PackageTmp. Se vuoi pubblicare i file da solo anziché utilizzare la funzione VS integrata, puoi prendere i file che devi effettivamente distribuire qui, piuttosto che raccogliere tutti i detriti digitali nella directory bin.


0

Fai attenzione ai setupprogetti se li stai usando; I progetti di installazione di Visual Studio vengono Primary Outputestratti dalla objcartella anziché da bin.

Stavo rilasciando applicazioni che pensavo fossero offuscate e firmate nelle msiconfigurazioni da un po 'di tempo prima di scoprire che i file delle applicazioni distribuite non erano in realtà né offuscati né firmati mentre eseguivo la procedura di post-compilazione sugli binassemblaggi di cartelle e avrei dovuto scegliere come target la objcartella assemblee invece.

Questo è tutt'altro che intuitivo, ma l' setupapproccio generale è quello di utilizzare Primary Outputil progetto e questa è la objcartella. Mi farebbe piacere se qualcuno potesse fare luce su questo BTW.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.