delphi compiler-construction delphi-2009 delphi-units

delphi - ¿Por qué mis unidades están "compiladas con una versión diferente" de mis propios archivos?



compiler-construction delphi-2009 (14)

Estoy construyendo un programa que usa complementos. Lamentablemente, el enlace dinámico del marco de plugins fuerza a RTL y VCL a salir de mi EXE de proyecto y a las versiones de BPL, y no tienen habilitada la información de depuración.

Así que construí un marco de prueba que enlaza a mis complementos estáticamente para que realmente pueda ver lo que estoy haciendo mientras rastreo el código. Pero ahora, cada vez que intento recompilar, aparece un error: "unit turbu_skills se compiló con una versión diferente de turbu_database.GDatabase"

He visto este error antes, pero solo cuando he estado cambiando cosas que probablemente no debería haber sido, como las bibliotecas RTL o VCL. No entiendo por qué está haciendo eso con mi propio código. Las unidades turbu_skills y turbu_database son unidades que yo misma escribí. GDatabase es una variable singleton global, cuya definición de clase no he cambiado en semanas. Cualquier cambio que desencadena una recompilación causa este error, incluso si no he tocado nada en ninguna de las unidades.

Hacer una compilación completa (SHIFT-F9) hace que se compile correctamente. Pero si presiono ESPACIO en una unidad ( cualquier unidad) y presiono F9, aparece el error nuevamente. ¿Qué está pasando y cómo lo detengo? Esto no ocurre en la aplicación principal, solo en el marco de prueba.

EDITAR: Tengo la fuente para todas mis unidades. Eliminar DCU y archivos similares no ayuda. Copiar el proyecto completo a una computadora diferente, eliminar todas las DCU y construir allí no ayuda. Existe un conflicto objetivo y reproducible entre el diseño de mi programa y el compilador, y quiero deshacerme de él.

La fuente se puede encontrar en http://www.turbu-rpg.com/downloads/Turbu_source_setup.exe si alguien quiere probarla. Requiere Delphi 2009 con el JVCL ya instalado; el paquete de instalación se encargará del resto. Tal vez tener el código fuente disponible ayudará a alguien a rastrearlo. Realmente lo espero, porque donde sea que esté el problema, me supera. El problema se puede encontrar en testing.exe y también en turbu.exe en turbu.groupproj.

EDIT 2: Resulta que esta era otra cuestión de genéricos cruzados. Grr. Logré codificar una solución. Solo espero que solucionen pronto los problemas con los genéricos.


El error "la unidad está compilada con una versión diferente de ..." es molesto. Ocurre en una situación como la siguiente:

+--------+ | unit A | +--------+ | | | | V | +--------+ | | unit B | | +--------+ | | | | | V V +--------+ | unit C | +--------+

Ambas unidades A y B usan la unidad C y la unidad B usa C. Las unidades B y C se compilan y, por alguna razón, la fuente de la unidad B no está disponible. Ahora la Unidad C se cambia (cualquier cambio se hará y se recompila) Y el dcu de la unidad C difiere de la unidad C utilizada por la unidad B, por lo que la unidad B necesita ser recompilada también. Pero desafortunadamente, la fuente no está disponible, por lo que el compilador se da por vencido.

No está del todo claro qué pasa con tu situación.

Tienes un marco de prueba que enlaza a los complementos. Entonces, ¿dónde encajan las unidades X e Y y reconoces el patrón que se muestra arriba?

Pero el hecho de que una construcción completa resuelva el problema es una pista en esta dirección. Y esta no es la primera vez que veo problemas con recompilaciones parciales. Así que siempre uso la versión completa.


Comprueba que no tengas un viejo archivo dcu filtrado en algún lugar del directorio de origen.


¿Estás usando un VCL modificado? Las unidades a las que hace referencia en su sección de interfaz también determinan su interfaz. Sugeriría que no tenga dos versiones diferentes de cualquiera de sus unidades con el mismo nombre (incluyendo VCL / RTL) a las que pueda hacer referencia desde su proyecto. Tal vez es algo tonto ya que la compilación de fondo está usando una versión diferente de las unidades y luego la compilación del disco. Así que al editarlo se desencadena el compilador de fondo, lo que daña la sincronización.


Odio este problema Me parece que aparece de vez en cuando y aunque suena en tu caso estar directamente relacionado con lo que estás haciendo con los complementos, he resuelto esto en el pasado al encontrar y eliminar todos los dcus, bpls y dcps de los paquetes que hemos escrito y luego reconstruido los paquetes.


Para referencia futura, simplemente apuntando el compilador a las versiones de código fuente de las "unidades problema" solucioné esto para mí (es decir, agregando las carpetas que contienen el código fuente a la ruta de búsqueda).


Definitivamente algo con errores con el compilador. He descubierto que alterar el orden de las unidades en la cláusula uses le permitirá obtener "una compilación libre". Después de eso, el error volverá a ocurrir y su recuperación volverá. :-(


Para mí, el problema fue que instalé Delphi con los componentes mínimos requeridos. Y cuando abrí un proyecto que se compiló con la instalación completa de Delphi, me pasó a mí. Copiando los archivos en la carpeta "Fuente" en la carpeta de instalación de Delphi desde otra máquina con la instalación completa de Delphi resolvió mi problema.


En mi caso, agregué las ubicaciones de las unidades "problemáticas" a la ruta de búsqueda de mi proyecto. Mientras lo pueda encontrar, compilado. Por supuesto, si tiene varias versiones del archivo en cuestión, podría complicar las cosas ...


  1. Su archivo .dpr real contiene una referencia a una versión incorrecta de un archivo .pas.

    Ver> Administrador de proyectos> expandir árbol y examinar la ruta de todas las unidades.

  2. Hay un archivo duplicado en la lista de rutas de búsqueda, y la versión incorrecta se encuentra primero


Esto me sucede muy a menudo cuando olvido cambiar el control de compilación de DPK de Rebuild, según sea necesario para Explict Rebuild en Opciones ... | Descripción .


La unidad ppParameter se compiló con una versión diferente de ppRelatv. TppRelative:

Borre todos los archivos .dcu en su carpeta de programa / su computadora, luego vuelva a compilar o vuelva a compilar. Entonces su programa funcionará bien nuevamente.


mi caso y solución:

  • teníamos una aplicación principal que crea un archivo exe y
  • algunos proyectos de complemento que crean archivos dll para este exe
    (el proyecto dll también necesita algunos de los archivos fuente de las aplicaciones)

a veces, al compilar los archivos dll, se produjo el problema "se compiló con una versión diferente"

el problema fue este:

  • el proyecto exe fue configurado para crear todos sus archivos dcu en un directorio separado: por ejemplo, App/DCUs
  • el proyecto dll tenía este directorio DCUs en la ruta de búsqueda, pero también algunos de los directorios fuente de la aplicación: por ejemplo, App/Utils , App/Core , etc.
  • por lo tanto, cuando compiló el proyecto dll, algunos de los archivos fuente de las aplicaciones se compilaron nuevamente (ahora posiblemente con una versión diferente de otras dependencias):
    y terminamos con 2 archivos dcu diferentes del mismo archivo *.pas

la solución es sencilla: elimine el directorio App/DCUs de la ruta de búsqueda del proyecto dll.


Cómo resolví la ''locura del camino'' en Delphi XE7:

Rule1: Always separate the DCU from the PAS files Tools -> Option -> Library path: Path to global (3rd party) libraries (DCU folder) that never change. c:/Delphi/Tools/FastMM/ c:/MyProjects/Packages/Third party packages/$(Platform) c:/MyProjects/Packages/DragDrop/$(Platform) c:/MyProjects/Packages/Graphics32/$(Platform) Project -> Options -> Search path: Path to personal libraries, that changes often. Enter the path to the DCU folder first, then path to PAS file. This way, the compiler will use the DCU files first, instead of recomilin every time from PAS files. It will recompile anyway if you do a Build. c:/MyProjects/Packages/cCommonControls/$(Platform)_$(Config) c:/MyProjects/Packages/cCommonControls/ Project -> Options -> Output directory: Leave it empty so the exe file is generated in project''s folder Project -> Options -> DCU output directory: Use ./$(Platform)_$(Config) in order to enforce Rule1


Acabo de recibir el mismo mensaje de error en Delphi XE. El mío se resolvió después de cerrar Delphi, abrirlo de nuevo y volver a compilar mi proyecto.