Nuestro equipo ha estado utilizando Delphi 6 durante muchos años, luego cambió a Delphi 2006 años atrás. Con ambas versiones tenemos el siguiente problema: con frecuencia el compilador se queja de una unidad que supuestamente se usa recursivamente. Esta unidad es una unidad LOC de 40k que se encuentra en el núcleo de un proyecto con casi 1 millón de LOC (incluido un tercero).Error de referencia circular incorrecto
El mensaje de error es incorrecto: una compilación completa en el proyecto siempre funciona. Lamentablemente, el mensaje de error no nos dice dónde se encuentra la supuesta referencia circular, solo el nombre de esa unidad. A veces, incluso ocurre que los mensajes de error válidos se enumeran de 2 a 4 veces hasta que el problema de referencia circular se "encuentra". Claramente el compilador se está ejecutando en un círculo aquí. Debido al tamaño de ese proyecto, es difícil encontrar el problema de forma manual. Por lo tanto, hice una herramienta que prueba que realmente no hay referencia circular (la herramienta crea un gráfico de dependencia dirigida de las unidades y determina los componentes de coherencia en ese gráfico; no hay ninguno excepto si incluyo deliberadamente alguno).
Esto no solo está afectando a la compilación F9 sino también a la finalización/visión del código que no funciona la mayor parte del tiempo. A veces funciona cuando presiono ctrl-space por segunda vez ...
¿Alguna idea de cómo podemos aislar o incluso solucionar el problema? Tenga en cuenta que será muy difícil dividir la unidad de 40k LOC en otras más pequeñas porque contiene alrededor de 15 clases grandes que dependen una de la otra en la sección de interfaz (sé que es malo, pero debería funcionar de todos modos).
actualización
Estamos constantemente refactorización pero esto es una unidad resistente a refactorizar, porque todo depende de todo, o casi. Hemos intentado sortearlo a través de interfaces, pero estamos hablando de algunas clases con cientos de métodos y propiedades. Y sería más lento.
La actualización a D2009 puede ser una opción en el futuro, pero ahora estamos atrapados con D2006 (las cosas Unicode y el precio son dos de los topes aquí). La pregunta es de todos modos si ayudaría ya que el problema está ahí desde D6 al menos.
Para recortar las cláusulas de uso, hemos estado haciendo esto frecuentemente con Icarus. Pero eso no ayudó hasta ahora. Ahora tenemos 90 unidades personalizadas en la sección de interfaz. Sin embargo, con una verdadera referencia circular, el problema podría estar en cualquier unidad. También intenté agregar todas las unidades al dpr.
El proyecto comparte mucho código con otros proyectos, y hay algunos IFDEF. Sin embargo, las definiciones no están configuradas en las opciones del proyecto, sino a través de un archivo de inclusión común. Por lo tanto, todos los módulos deberían ver lo mismo define. Además, el problema vuelve a ocurrir poco después de una reconstrucción completa sin cambiar a otro proyecto.
Derecho, utilizamos dcc32 en una secuencia de comandos de compilación completa sobre todos los proyectos (y más). No estoy esperando usarlo como un reemplazo para la compilación IDE; no ayudaría con la perspectiva del código y quién sabe con qué frecuencia sería necesario entonces. ¿Pero tal vez es una forma de diagnosticar el problema? Idealmente dcc32 incremental se encontraría con el mismo problema y su resultado desencadena algunas ideas ... –
Sí, eso es exactamente lo que estaba tratando de sugerir, tal vez no lo logré aclarar :-(Lo siento. Usando dcc32 debería ver qué archivos se compilan varias veces, y después de qué archivo todo se detiene. A menos que el compilador IDE y dcc32 sean realmente tan diferentes, pero esto no lo asumiría. – mghie