2009-05-11 21 views
6

Il nostro progetto utilizza molte librerie statiche per creare l'applicazione. Come possiamo essere certi di utilizzare la versione di rilascio delle librerie nella versione di rilascio dell'applicazione?Come identificare se una libreria è DEBUG o RELEASE build?

Stiamo commettendo errori prendendo la libreria di debug nella build dell'applicazione di rilascio.

Sto cercando un modo elegante in cui è possibile scrivere un modulo in quanto è possibile verificare se una determinata libreria è rilasciata o eseguire il debug e segnalarla se non corrisponde. La nostra applicazione è scritta in C/C++. (Piattaforma MSVC & GCC)

+1

si potrebbe desiderare di aggiungere che toolchain e la piattaforma che si sta utilizzando, ad esempio, MSVC, GCC? –

+0

C'è qualche tipo di indicatore su/nelle librerie che indica se sono build di debug o di rilascio o no? –

risposta

2

L'approccio normale è Eithr per assegnare alle librerie nomi diversi o memorizzarli in directory diverse, come Debug e Release. E se la tua build è correttamente automatizzata, non riesco a vedere come puoi sbagliare.

+0

diciamo che hai ereditato un sacco di librerie e non sai come sono costruite. A corto di collegarli e aspettare i fallimenti c'è un modo per scoprirlo? – stu

2

Non è possibile risolvere questo utilizzando le convenzioni di denominazione (ad esempio, foo_rel.a e foo_dbg.a)?

0

Normalmente si distinguerebbero le versioni utilizzando nomi leggermente diversi. Ad esempio sotto build di debug tutte le librerie hanno il suffisso con un carattere 'd' prima della loro estensione. Ex. commonUtilsd.lib In modalità di rilascio lo stesso sarebbe commonUtils.lib. Questo approccio IMHO è più semplice e più pulito. In MSVC, l'utilizzo può specificare il nome file di output sotto

Librarian-->General-->Output File 

Un altro consiglio è quello di avere questi file di output nella directory di configurazione. ho una versione di debug nella cartella Debug e versioni di rilascio nella cartella Release. Di nuovo sotto MSVC questo può essere fatto genericamente usando la macro IDE $ (ConfigurationName). E allegare il percorso giusto nelle directory di ricerca durante la compilazione.

1

Convenzioni di denominazione a parte, se siete su un sistema unix-like, probabilmente si può analizzare l'output di:

objdump -g mylib.a 

Se si ottiene solo righe vuote o linee che iniziano con i nomi dei file oggetto, poi si non avere informazioni di debug nella libreria.

Si noti che questo non significa generalmente che la libreria è "rilascio" o "debug", ma è significa nel vostro caso.

4

Sì. È possibile controllare il campo Characteristics della struttura IMAGE_FILE_HEADER del file. Se la libreria è una versione di rilascio, verrà impostato il bit 0x0200 (DEBUG_STRIPPED); su una build di debug, sarà chiaro.

È possibile trovare informazioni tecniche sul formato PE utilizzato da EXE e DLL di Windows, per vedere come recuperare tale struttura, in varie posizioni sulla rete (ad esempio here).

+0

Non riesco a distinguere tra DEBUG e RELEASE se i simboli di debug sono in PDB. Ho compilato una dll C++ nel debug (i simboli di debug sono stati rimossi nel PDB) e la modalità di rilascio e il bit DEBUG_STRIPPED non è in grado di distinguerlo. – qub1n

1

Che ne dici di avere una semplice funzione che restituisce la versione della libreria? Restituisci cose diverse in base al debug o al rilascio della tua build. Chiama questa funzione all'inizio della tua app e segnala l'errore.

+0

molto più semplice di tutti gli altri rifiuti suggeriti. –

+0

sì, buon suggerimento – Manoj

0

io uso e testato con successo questo codice:

using System.Diagnostics; 

FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(fileName); 
return fvi.IsDebug; 
+0

c'è uno strumento da linea di comando/gui per questo? – stu

Problemi correlati