2011-07-10 17 views
6

A veces parece que no se ha creado un nuevo ejecutable, aunque lo necesito, pero no entiendo por qué. Por ejemplo, cuando cambio un Makefile, pero ya hay un ejecutable, y cuando ejecuto 'make' no crea un ejecutable actualizado.¿Por qué/cuándo necesito un objetivo "limpio"?

¿No es todo el propósito de Makefiles para que ya no tenga que preocuparme por eso?

Respuesta

6

Desde el GNU make documentation

La recompilación se debe hacer si el archivo de origen, o cualquiera de los archivos de cabecera nombradas como dependencias, es más reciente que el archivo de objeto, o si no existe el fichero objeto.

No está cambiando su Makefile que lo desencadena.

make clean elimina todos los archivos de objetos que se han creado mientras tanto. Normalmente, no es gran cosa recompilar parcialmente, es decir, solo para recompilar los archivos que ha cambiado y, finalmente, vincular los archivos objeto recién creados con los archivos ya existentes. Aún así, si quiere estar absolutamente seguro, debe ejecutar make clean antes de ejecutar make nuevamente.

Un ejemplo donde mantener viejos archivos de objeto (es decir, nunca ejecutar make clean) puede convertirse en un problema: supongamos que tiene un archivo de objeto ya existente que está vinculado a la versión 1.0 de alguna biblioteca. Ahora actualiza su máquina y esto instalará la versión 1.1, donde algunas funciones son incompatibles con la función 1.0. Pero dado que el archivo de objeto se compiló esperando la versión anterior, el proceso de enlace fallará.

+0

No me convence su ejemplo. Si una actualización de una biblioteca cambia su interfaz, tendrá que realizar cambios en el código de todos modos, lo que provocaría una recompilación de los objetos afectados. Entonces no hay necesidad de 'hacer limpieza' allí. – eriktous

+0

No necesariamente: si el resto de los archivos en los que está trabajando no se basarán en esa biblioteca específica, los objetos afectados no se volverán a compilar. – emboss

+0

Si algún objeto es incompatible con la nueva biblioteca, su origen se debe cambiar de todos modos para reflejar los cambios en la interfaz. Hacer un 'make clean' no hará que desaparezca, y los enlaces seguirán fallando. – eriktous

1

Bueno, es una pregunta muy amplia. En general, puede escribir un archivo MAKE que rastreará todas las dependencias (incluido su propio tiempo de modificación). Sin embargo, no es trivial y los errores pueden rastrearse a su archivo make lo mismo que a cualquier otro código. Por lo tanto, a veces es más fácil limpiar todo y reconstruir al sospechar que algo no se creó correctamente.

Hay muchos other build tools, como scons que pueden ser más robustos/automáticos que makefile.

1

Haz que los analitos sean las dependencias definidas en tus Makefiles y crea un gráfico de dependencia a partir de eso.

Si detecta que alguno de los requisitos necesarios para la salida (binarios) cambia, se reconstruye, o al menos la parte que ha cambiado.

Por lo tanto, si su dependencia incluye los Makefiles, probablemente no debería, make actualizaría el binario una vez que haya cambiado el Makefile.

La vida con Makefiles no siempre es más fácil, pero puede ayudar mucho de todos modos.

Cuestiones relacionadas