2010-11-28 11 views
9

Tengo un archivo llamado "main.c". ¿Cuál es el Makefile más simple que puedo tener para compilar este archivo en un ejecutable que puedo ejecutar como ./blah?¿Cuál es el más simple ¿PUEDO tener las obras para un único archivo C?

+0

Por favor, haga un esfuerzo para hacer su tarea antes de pedirlo. Hay una razón por la que su profesor quiere que use un Makefile, para que pueda aprender a escribir Makefiles para proyectos más útiles. –

+3

Lo siento, no fue para molestar a la policía de deberes. Intenté buscar en Google, pero el Makefile obviamente es increíblemente poderoso y puede ser extremadamente complejo. Reconozco que tengo algunos problemas para comprenderlo en gran medida. Esta asignatura no es un tema de programación, pero la evaluación requiere un código C para llamar a las funciones nativas del sistema operativo. Nunca antes había tocado C, y esta tarea vence en un par de horas. Estaba frustrado, desesperado y necesitaba ayuda. lo siento si te molesto. – Ash

Respuesta

9
all: 
    gcc -o blah main.c 

No necesita makefile aquí, el script de shell simple está bien.

+0

hoja de asignación decir que debemos incluir un Makefile. – Ash

+0

Cuando lo usé y ejecuté 'make' - devuelve" Makefile: 2: *** separador faltante. Detener ". – Ash

+1

@Ash: el bit delante de 'gcc' tiene que ser una pestaña, no espacios. (Obtiene ese error si usa espacios.) –

4
all: blah 
blah: main.c 
    gcc main.c -o blah 
+0

Escribí y publiqué mi respuesta antes de mostrar cualquier otra cosa, y no vi la etiqueta de 'tarea'. Estoy de acuerdo con Chris Lutz; no llegarás a ningún lado en la vida pidiendo ayuda en asignaciones tan miserables. –

+1

'all: blah' hace que esto sea menos simple que debe ser y también puede romper cosas si un archivo llamado' all' en realidad existiera. Aparte de este punto, esta es la mejor respuesta. –

+0

En realidad, después de pensarlo más, en este caso simple un archivo llamado 'all' probablemente no va a romper la comprobación de dependencia; sigue siendo redundante ya que make tratará al primer objetivo como el objetivo predeterminado en cualquier caso. –

10

si se está ejecutando GNU Make y si no es necesario enlazar en las bibliotecas adicionales, el makefile más simple hay makefile en absoluto. Proveedores:

make main 

Si no quieren tener que especificar main, a continuación, puede utilizar la línea siguiente Makefile:

all: main 

GNU Make tiene varias reglas implícitas que utiliza si no los definas tú mismo. La que hace que este trabajo es algo así como:

%: %.c 
     $(CC) $^ -o [email protected] 

Para obtener más información, véase: http://www.gnu.org/software/make/manual/make.html#Using-Implicit

+0

Aparentemente, la tarea requiere que la salida sea 'blah', no' main', por lo que necesitará un Makefile. Lo anterior sigue siendo información útil, pero no se aplicará aquí. –

+1

Si su ejecutable debe llamarse 'blah', lo más fácil sería simplemente cambiar el nombre de su archivo fuente a' blah.c' si esto está permitido. –

+0

@ T.J.Crowder: 'blah' no parece ser un requisito, sino más bien un ejemplo: OP dijo" que puedo ejecutar * como * './Blah'". Entonces, este '' Makefile '' de un solo lienzo parece estar bien – MestreLion

2

El más simple que recomendaría es:

myprog: myprog.o 
     $(CC) -o [email protected] @^ 

Via reglas implícitas, esto dará lugar a un paso separado que compila myprog.c a myprog.o antes de vincularlo. La razón por la que me gusta esta mejor que la otra respuesta (por Arnaud) es que las escalas de varios archivos originales sin tener que agrandar el makefile significativamente:

myprog: myprog.o foo.o bar.o helper.o my.o your.o his.o her.o 
     $(CC) -o [email protected] @^ 
+0

¿Debería ser '$ ^' en lugar de '@ ^'? – user2023370

0

Como dijo Jander, si la fuente es un archivo único llamado blah.c usted podría utilizar esta opción para emitir un ejecutable llamado blah:

all: blah 

O incluso:

blah: 

Todo lo demás es implícita al usar GNU make

Si bien esto es extremadamente simple, que tiene algunas ventajas sobre algunas de las respuestas más complejas:

  • compilador no está codificado: deje que su entorno de elegir gcc para usted!
  • El nombre de su programa se establece solo una vez, una buena práctica de programación DRY.
  • No crea archivos intermedios *.o que no son necesarios para este proyecto simple.

Dicho esto, me sugieren fuertemente que usted mejore su Makefile mediante la adición de al menos clean y all reglas y -Wall banderas.Esto se puede hacer con la siguiente Makefile, manteniendo todas las ventajas anteriores:

 
TARGET=blah 
CFLAGS=-Wall 

.PHONY: all clean 

all: $(TARGET) 

$(TARGET): 

clean: 
    rm -f $(TARGET) 
Cuestiones relacionadas