c++ - instalar - mingw
GeneraciĆ³n de dependencia gcc para un directorio de salida diferente (7)
Estoy usando gcc para generar un archivo de dependencia, pero mis reglas de compilación ponen el resultado en un subdirectorio. ¿Hay alguna manera de decirle a gcc que ponga mi prefijo de subdirectorio en el archivo de dependencia que genera para mí?
gcc $(INCLUDES) -E -MM $(CFLAGS) $(SRC) >>$(DEP)
[GNU] make se enoja si no coloca la salida en el directorio actual. Lo que realmente debe hacer es ejecutar make desde el directorio de compilación y usar la variable de creación de VPATH para ubicar el código fuente. Si le mientes a un compilador, tarde o temprano se vengará.
Si insiste en generar sus objetos y dependencias en algún otro directorio, necesita usar el argumento -o tal como lo responde Emile.
Ok, solo para asegurarme de que tengo la pregunta correcta: supongo que tienes test.c que incluye test.h, y quieres generar subdir / test.d (mientras no generes subdir / test.o) donde subdir / test.d contiene
subdir/test.o: test.c test.h
más bien que
test.o: test.c test.h
que es lo que obtienes en este momento. ¿Está bien?
No pude encontrar una manera fácil de hacer exactamente lo que estás pidiendo. Sin embargo, si mira http://www.gnu.org/software/gcc/news/dependencies.html , si desea crear el archivo .d mientras genera el archivo .o, puede usar
gcc $ (INCLUYE) -MMD $ (CFLAGS) $ (SRC) -o $ (SUBDIR) / $ (OBJ)
(Dado SRC = test.c, SUBDIR = subdir y OBJ = test.o) Esto creará tanto subdir / test.o como subdir / test.d, donde subdir / test.d contiene el resultado deseado como se indicó anteriormente. Espero que ayude.
Si hay un argumento para que gcc haga esto, no sé de qué se trata. Terminamos canalizando la salida de dependencia a través de sed para reescribir todas las ocurrencias de .o como $ {OBJDIR} /. O
Supongo que estás usando GNU Make y GCC. Primero agregue una variable para contener su lista de archivos de dependencia. Suponiendo que ya tiene uno que enumera todas nuestras fuentes:
SRCS = /
main.c /
foo.c /
stuff/bar.c
DEPS = $(SRCS:.c=.d)
Luego incluya las dependencias generadas en el archivo MAKE:
include $(DEPS)
A continuación, agregue esta regla de patrón:
# automatically generate dependency rules
%.d : %.c
$(CC) $(CCFLAGS) -MF"$@" -MG -MM -MP -MT"$@" -MT"$(<:.c=.o)" "$<"
# -MF write the generated dependency rule to a file
# -MG assume missing headers will be generated and don''t stop with an error
# -MM generate dependency rule for prerequisite, skipping system headers
# -MP add phony target for each header to prevent errors when header is missing
# -MT add a target to the generated dependency
"$ @" es el objetivo (lo que está en el lado izquierdo de:), "$ <" es el requisito previo (lo que está en el lado derecho de:). La expresión "$ (<:. c = .o)" reemplaza la extensión .c con .o.
El truco aquí es generar la regla con dos objetivos al agregar -MT dos veces; esto hace que tanto el archivo .o como el archivo .d dependan del archivo fuente y sus encabezados; De esta forma, el archivo de dependencia se regenera automáticamente cada vez que se modifican los archivos .c o .h correspondientes.
Las opciones -MG y -MP hacen que no se asuste si falta un archivo de cabecera.
Puede que te guste esta versión más breve de la respuesta de Don McCaughey:
SRCS = /
main.c /
foo.c /
stuff/bar.c
DEPS = $(SRCS:.c=.d)
Add -include $(DEPS)
tenga en cuenta el prefijo -
, que silencia los errores si los archivos .d
aún no existen.
No es necesario que una regla de patrón separada genere los archivos de dependencia. Simplemente agregue -MD
o -MMD
a su línea de compilación normal, y los archivos .d
se generan al mismo tiempo que se compilan sus archivos de origen. Por ejemplo:
%.o: %.c
gcc $(INCLUDE) -MMD -c $< -o $@
# -MD can be used to generate a dependency output file as a side-effect of the compilation process.
Detallar la respuesta de DGentry me ha funcionado bien:
.depend: $(SOURCES)
$(CC) $(CFLAGS) -MM $(SOURCES) | sed ''s|[a-zA-Z0-9_-]*/.o|$(OBJDIR)/&|'' > ./.depend
Esto también funciona en el caso donde solo hay un archivo de dependencia que contiene las reglas de dependencia para todos los archivos fuente.
La respuesta está en el manual de GCC : use la bandera -MT
.
-MT target
Cambia el objetivo de la regla emitida por la generación de dependencia. Por defecto, CPP toma el nombre del archivo de entrada principal, elimina cualquier componente de directorio y cualquier sufijo de archivo, como
.c
, y agrega el sufijo de objeto habitual de la plataforma. El resultado es el objetivo.Una opción
-MT
establecerá que el destino sea exactamente la cadena que especifique. Si quiere objetivos múltiples, puede especificarlos como un único argumento para-MT
, o usar múltiples opciones-MT
.Por ejemplo,
-MT ''$(objpfx)foo.o''
podría dar
$(objpfx)foo.o: foo.c