2009-08-28 20 views
12

tenemos un código C++ en el que necesitamos crear un archivo make. Cada par .h y .C crea un objeto y luego algunos objetos se unen para formar un ejecutable. Bastante estándar.gmake compila todos los archivos en un directorio

Este comando no GNU make simplemente construye todos los archivos en objeto de un directorio

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

Lo que esto hace es para cada archivo .C% (es decir, todos los archivos .C) crear un archivo correspondiente .o .

¿Alguien sabe cómo hacer esto con gmake?

Saludos

Marcos

Respuesta

19

La sintaxis que ha mostrado se llama una regla de patrón en GNU make lenguage, y constituye la piedra angular 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 innecesariamente ineficiente. Le sugiero que en lugar de utilizar $ (comodín), que es un GNU make función integrada diseñada para este propósito:

SRCS = $(wildcard *.C) 
OBJS = $(patsubst %.C,%.o,$(SRCS)) 
foo: $(OBJS) 
     $(CC) -o [email protected] $^ 

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

Si están buscando algo más concisa, la siguiente también funcionará:

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

Esto simplemente elimina las variables y aprovecha el hecho de que GNU make proporciona una regla de patrón predeterminada %.o: %.C, así como una regla predeterminada para vincular un archivo ejecutable a partir de un conjunto de objetos. Personalmente usaría la versión más detallada ya que me parece más fácil de leer y mantener, pero a cada uno la suya.

Espero que ayude,

Eric melski

1

Este es un ejemplo de un pattern rule, que debería funcionar bien en gmake. Para compilaciones muy simples como esta, puedes confiar principalmente en el implicit rules. Lo más importante que tiene que especificar en el destino 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) 

Nota el uso de simply expanded variable operador de asignación (:=) en lugar del operador de asignación recursiva (=) que puede reducir la cantidad de reprocesamiento hace en compilaciones más complicadas.

+0

Usted está equivocado; el OP muestra una regla de patrón estándar, no una regla de patrón estático, y no hay una buena razón para usar $ (shell) aquí donde $ (comodín) hará el truco sin la sobrecarga adicional. –

+0

@Eric: Correcto sobre la regla del patrón estático, por supuesto. Fijo. Uso $ (shell) mucho a pesar del fork extra porque a menudo generalizo el comando. Al usar: = asignación, sufro el extra solo una vez. – dmckee

+0

puede usar tan fácilmente: = con $ (comodín) si lo desea. –

Cuestiones relacionadas