2009-02-24 15 views
5

Cuando construyo un proyecto usando un compilador C++, ¿puedo asegurarme de que el binario producido no se vea afectado si no hubo cambios en el código fuente? Parece que cada vez que recompilo mi fuente, la suma de comprobación md5 del binario se ve afectada. ¿El momento de la compilación de alguna manera afecta el binario producido? ¿Cómo puedo producir resultados de compilación que sean repetibles?Generación de código objeto repetible C++

+1

Tal vez lo que necesita es una mejor manera de realizar un seguimiento de las versiones aparte de md5 el binario? –

+0

¿Para qué necesita esto? – jalf

Respuesta

1

Utilice un sistema de compilación incremental, como make, para asegurarse de no volver a compilar su código si la fuente no cambia.

Es posible que su compilación haga binarios idénticos de la misma fuente, o no, depende del compilador. La mayoría incrustará la hora actual en el binario generado en alguna parte.

+0

compilaciones incrementales pueden agregar datos adicionales a los archivos de objeto que crearán diferencias. En su lugar, es posible que desee utilizar compilación no incremental, que compila desde cero cada vez. Consulte este artículo de MS: http://msdn.microsoft.com/en-us/library/4khtbfyf.aspx – tguclu

+0

@tguclu Ese es un significado diferente de incremental que el mío. Según mi definición, un sistema de compilación incremental no hace ninguna diferencia en los objetos de salida: solo se reconstruyen si cambian sus fuentes. –

2

Sospecho que dependerá en gran medida de su cadena de herramientas y sistema operativo. Por ejemplo, si uno de los encabezados ejecutables contiene una marca de tiempo, siempre encontrará que el MD5 resultante es diferente.

¿Cuál es el resultado final que está tratando de lograr (es decir, por qué es tan importante que sean idénticos)?

+0

Estoy buscando respuestas principalmente en Visual Studio y Xcode/gcc. Reconstruimos nuestro producto todos los días. Me gustaría saber de manera confiable qué dlls han cambiado entre dos compilaciones. ¿Puedo hacer esto configurando algunos indicadores en el compilador/enlazador para no usar información de marca de tiempo al generar binarios? – user70336

+0

No tan lejos como sé. – Sean

3

Uno puede desmontar los binarios y ejecutar MD5 en la salida

Ejemplo de MacOSX

otool -tV a.out | md5 
ee2e724434a89fce96aa6b48621f7220 

Pero, uno se pierde en los datos globales ... (podría ser un parámetro para incluir también)

estoy respondiendo sobre el problema de la comprobación md5 un binario ... cómo administrar sus fuentes y el sistema construye como otros han escrito acerca es también una cosa que mirar

2

No se puede hacer una comparación de suma de comprobación md5 para visual studio. Para un archivo .exe de versión de lanzamiento normal de Visual Studio habrá 3 ubicaciones que cambiarán con cada recompilación. 2 de ellos son marcas de tiempo y el tercero es un GUID único que Visual Studio usa para unir versiones de .exe con archivos de ayuda para garantizar que estén sincronizados.

Puede ser posible escribir una herramienta que pondrá a cero los 3 campos cambiantes, pero no estoy seguro de lo fácil que sería analizar el archivo.

Además, si está llamando a cualquier .dlls, si recuerdo bien, obtendrá más identificadores únicos en el archivo generado.

La versión de depuración es una historia diferente. Creo que hay muchas, muchas más diferencias.

Cuestiones relacionadas