2009-08-03 18 views
6

Tengo 3 máquinas de construcción. Uno ejecutándose en Windows 2000, uno con XP SP3 y otro con Windows Server de 64 bits 2008. Y tengo un proyecto C++ nativo para compilar (estoy compilando con visual studio 2005 SP1). Mi objetivo es construir "exactamente" el mismo dll usando estas máquinas de construcción.Idéntica construcción en diferentes sistemas

Me refiero exactamente a bit por bit (excepto la marca de tiempo de compilación por supuesto).

Con win2k y winxp estoy obteniendo dll's idénticos. Pero difieren de dll construido con el servidor win2008. He logrado obtener dll casi idénticos, pero hay algunas diferencias. Después de desmontar los archivos descubrí que el orden de las funciones no es el mismo (3 funciones están en orden diferente).

¿Alguien sabe cuál podría ser la razón para eso?

Y una pregunta adicional: En vcbuild.exe encontré un interruptor/PEDIDO. Que toma el archivo de orden de función como entrada. ¿Alguien sabe cómo debería ser ese archivo?

+0

¿Ha intentado ejecutar VS en el modo de compatibilidad de 32 bits (o como se llame)? – Makis

+0

Tiene que ejecutarse en compat de 32 bits, no hay una versión de 64 bits del estudio visual AFAIK – ppiotrowicz

+1

1. ¿La máquina Server 2008 está ejecutando una CPU diferente? (Una vez vi un problema similar en el que una máquina AMD producía una salida ligeramente diferente a INTEL: extraño pero cierto). 2. ¿Ha comprobado las actualizaciones instaladas para ver si algo allí ha cambiado algún componente de VS? –

Respuesta

7

Puede pensar que la compilación es puramente determinista (las entradas idénticas dan salida idéntica, todas las veces), pero no es necesario que sea así. Por ejemplo, considere el optimizador: va a necesitar algo de memoria para trabajar, probablemente más para métodos de optimización más altos. Si en una máquina falla una asignación de memoria (porque la máquina tiene menos memoria), entonces el compilador podría omitir esa optimización específica, lo que provocaría que se emitiera un código diferente.

Hay muchas situaciones similares, por lo que puede estar poniendo mucho esfuerzo en algo que no es factible. ¿Por qué necesita que los archivos DLL sean idénticos a los bits, de todos modos?

+0

Con las optimizaciones desactivadas (/ interruptor Od) tengo el mismo problema. La igualdad de bit a bit es crucial en este proyecto (realmente no puedo discutir por qué, lo siento). – ppiotrowicz

+2

La optimización fue solo un ejemplo: hay MUCHAS cosas que pueden hacer que el compilador produzca resultados diferentes. –

0

¿Ejecuta la misma versión de la herramienta de cadena (compilador, vinculador, ...), incluida la diferencia de 32/64 bits?

+0

Sí, estoy compilando con vs2005 con SP1 en todas partes (también está instalado .net 2.0 SP1). Construyendo a la plataforma win32. – ppiotrowicz

+0

¿Estás seguro de que estás utilizando la versión de 32 bits del compilador y el enlazador en Win2008? – AProgrammer

+0

Sí, estoy seguro. Están en Archivos de programa (x86) – ppiotrowicz

0

¿Windows Server 2008 es la única máquina que ejecuta 64 bit? Si es así, ese podría ser tu problema.

+0

Podría ser, pero los dlls de los sistemas de 32 bits son casi idénticos. La única diferencia es que _3_ funciones están en orden diferente (y hay muchas funciones en el proyecto). El código Desinstalado es casi el mismo. – ppiotrowicz

Cuestiones relacionadas