Pregunta

Tenemos algún código C ++ en el que necesitamos crear un archivo de fabricación. Cada par .h y .c crea un objeto y luego algunos objetos están vinculados para formar un ejecutable. Cosas bastante estándar.

Este comando no gana simplemente construye todos los archivos en objeto en un directorio

%.o:%.C
    $(CC) $(CPFLAGS)  -c  $<

Lo que esto hace es para cada archivo de %.c (es decir, cada archivo .c) crea un archivo .o correspondiente.

¿Alguien sabe cómo hacer esto con Gmake?

Salud

Marca

¿Fue útil?

Solución

La sintaxis que ha mostrado se llama regla de patrón en GNU, hace un lenguaje, y forma la piedra de esquina de su solución. Todo lo que necesita es agregar una forma de obtener la lista de archivos .c dinámicamente. Otros han mostrado soluciones que usan $(shell) Para hacer esto, pero eso es ineficientemente ineficiente. Sugiero que use $ (comodín), que es una función de GNU incorporada diseñada para este propósito:

SRCS = $(wildcard *.C)
OBJS = $(patsubst %.C,%.o,$(SRCS))
foo: $(OBJS)
        $(CC) -o $@ $^

%.o: %.C
        $(CC) $(CPFLAGS)  -c  $<

Si está buscando algo más conciso, lo siguiente también funcionará:

foo: $(patsubst %.C,%.o,$(wildcard *.C))

Esto solo elimina las variables y aprovecha el hecho de que GNU Make proporciona un valor predeterminado %.o: %.C Regla del patrón, así como una regla predeterminada para vincular un ejecutable juntos de un conjunto de objetos. Personalmente, usaría la versión más detallada, ya que me resulta más fácil leer y mantener, pero para cada uno.

Espero que ayude,

Eric Melski

Otros consejos

Éste es un ejemplo de un regla de patrones, debería funcionar bien en gmake. Para construcciones muy simples como esta, principalmente puedes confiar en el reglas implícitas. Lo principal que debe especificar en el objetivo que desea construir y sus dependencias:

CXXFLAGS:=-g -O -Iincludes
LDFLAGS:=-lm

SRCS:=$(shell ls *.C)          # select all .C files as source
OBJS:=$(substr .C,.o,$(SRCS)   # list the corresponding object files

foo : $(OBJS)

Tenga en cuenta el uso de Variable simplemente expandida Operador de asignación (:=) en lugar del operador de asignación recursiva (=) que puede reducir la cantidad de reprocesamiento de la marca en construcciones más complicadas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top