es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué el ” %.moc ” no funciona en mi Makefile?

Tengo el siguiente Makefile:

CC=g++ -std=c++17
MYCXXFLAGS=-Werror -Wall

clean:
rm -f *.o main

a.moc:
@echo “mocing $@”

%.o: %.cpp %.moc
@echo “all prerequisites $^”
$(CC) $(MYCXXFLAGS) -o $@ -c $<

Bajo el mismo directorio donde se encuentra el Makefile, hay un archivo llamado “a.cpp”.

Cuando hago “make a.o”, se imprime lo siguiente:

mocing a.moc
all prerequisites a.cpp a.moc
g++ -std=c++17 -Werror -Wall -o a.o -c a.cpp

Lo cual es perfecto. El archivo “a.moc” se identifica y se ejecuta.

Sin embargo, si reemplazo

a.moc:
@echo “mocing $@”

con

%.moc:
@echo “mocing $@”

Entonces las cosas comienzan a cambiar. Solo se imprime lo siguiente:

g++ -c -o a.o a.cpp

Parece que la introducción de “%.moc:” arruina todo. Este es solo un ejemplo de demostración. En mi entorno real, “%.moc” realmente realiza alguna operación de moc de Qt. Me pregunto por qué “a.moc” puede identificarse como un destino válido y se ejecuta, mientras que “%.moc” no puede lograr el objetivo.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual reemplazar “a.moc:” por “%.moc:” causa problemas, es porque el segundo es una regla de patrón que coincide con cualquier archivo que termine en “.moc”, mientras que el primero es una regla específica para el archivo “a.moc”.

    Cuando se usa “a.moc:”, el Makefile sabe que debe buscar un archivo específico llamado “a.moc” y ejecutar el comando asociado. Sin embargo, cuando se usa “%.moc:”, el Makefile está buscando cualquier archivo que termine con “.moc”, y el comando asociado solo se ejecuta si el Makefile puede encontrar un prerrequisito para ese objetivo.

    En el ejemplo de Makefile dado, no hay prerrequisito para “a.moc”, por lo que no es un problema cuando es una regla específica. Pero cuando es una regla de patrón, el Makefile no puede encontrar un prerrequisito para ejecutar el comando asociado, y por lo tanto el destino no se ejecuta.

    Para solucionar este problema, se pueden definir reglas específicas para cada archivo que necesite ser mocado, o se puede utilizar un paso de construcción separado que ejecute explícitamente el moc en todos los archivos que necesiten ser mocados antes de ejecutar make para construir el proyecto.

Comments are closed.