2009-05-11 19 views
6

Nuestro proyecto utiliza muchas bibliotecas estáticas para compilar la aplicación. ¿Cómo podemos asegurarnos de que estamos utilizando la versión de lanzamiento de las bibliotecas en la versión de lanzamiento de la aplicación?¿Cómo identificar si una biblioteca es creación DEBUG o RELEASE?

Estamos cometiendo errores al tomar la biblioteca de depuración en la creación de la aplicación de lanzamiento.

Estoy buscando una manera elegante en la que pueda escribir un módulo para que podamos verificar si una biblioteca en particular es de lanzamiento o depuración e informarla si no coincide. Nuestra aplicación está escrita en C/C++. (Plataforma MSVC & GCC)

+1

Es posible que desee añadir, que la cadena de herramientas y la plataforma que está utilizando, por ejemplo, MSVC, GCC? –

+0

¿Hay algún tipo de indicador en/en las bibliotecas que indique si se trata de versiones de lanzamiento o depuración o no? –

Respuesta

2

El enfoque normal es darle a las bibliotecas diferentes nombres o almacenarlas en directorios diferentes, como Debug and Release. Y si su compilación está correctamente automatizada, no veo cómo puede cometer errores.

+0

digamos que has heredado un grupo de bibliotecas y no sabes cómo están compiladas. A falta de vincularlos y esperar fallas, ¿hay alguna forma de averiguarlo? – stu

2

¿No puede resolver esto usando las convenciones de nomenclatura (es decir, foo_rel.a y foo_dbg.a)?

0

Normalmente, uno distinguiría las versiones con nombres ligeramente diferentes. Por ejemplo, en las versiones de depuración, todas las bibliotecas tienen el sufijo 'd' antes de su extensión. Ex. commonUtilsd.lib En modo de liberación, lo mismo sería commonUtils.lib. Este enfoque en mi humilde opinión es más simple y más limpio. En MSVC uso puede especificar el nombre del archivo de salida en

Librarian-->General-->Output File 

Otra recomendación es tener estos archivos de salida en el directorio de configuración. es decir, tienen la versión de depuración en la carpeta Depuración y las versiones de lanzamiento en la carpeta de Lanzamiento. De nuevo en MSVC, esto se puede hacer de manera genérica utilizando el IDE-macro $ (Nombre de configuración). Y adjunte la ruta correcta en los directorios de búsqueda durante la compilación.

1

Convenciones de nombres a un lado, si estás en un sistema Unix, es probable que pueda analizar la salida de:

objdump -g mylib.a 

Si usted consigue solamente las líneas vacías o líneas que comienzan con nombres de archivo objeto, entonces no tener información de depuración en la biblioteca.

Tenga en cuenta que esto no significa generalmente que la biblioteca es "versión" o "depuración", pero puede lo significa en su caso.

4

Sí. Puede verificar el campo Characteristics de la estructura IMAGE_FILE_HEADER del archivo. Si la biblioteca es una compilación de lanzamiento, entonces se establecerá el bit 0x0200 (DEBUG_STRIPPED); en una construcción de depuración, será claro.

Puede encontrar información técnica sobre el formato PE utilizado por Windows EXEs y DLL para ver cómo recuperar esa estructura en varios lugares de la red (como here).

+0

No puedo distinguir entre DEPURACIÓN y LIBERACIÓN si los símbolos de depuración están en PDB. Recopilé un archivo DLL de C++ en la depuración (los símbolos de depuración se eliminan en PDB) y el modo de lanzamiento y el bit DEBUG_STRIPPED no puede distinguirlo. – qub1n

1

¿Qué le parece tener una función simple que devuelve la versión de la biblioteca? Devuelve diferentes cosas en función de que tu versión esté depurada o liberada. Llame a esa función al inicio de su aplicación e informe el error.

+0

mucho más simple que todas las otras basuras sugeridas. –

+0

sí, buena sugerencia – Manoj

0

yo uso y probado con éxito este código:

using System.Diagnostics; 

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

¿existe una herramienta de línea de comandos/gui para esto? – stu

Cuestiones relacionadas