2012-08-03 24 views
8

Tengo que ejecutar estos 4 comandos en el terminal cada vez que deseo ejecutar el programa usando librerías.Makefile para una biblioteca

Las líneas son

cc -m32 -c mylib.c 
ar -rcs libmylib.a mylib.o 
cc -m32 -c prog.c 
cc -m32 prog.o -L. -lmylib 
./a.out 

¿Cómo hago un makefile para los comandos anteriores y ejecutarlo? Se agradecería un procedimiento detallado. Gracias.


Editar: Aquí está la solución:

a.out: prog.o libmylib.a 
     cc prog.o -L. -lmylib 

prog.o: prog.c mylib.h 

libprint_int.a: mylib.o 
     ar -rcs libmylib.a mylib.o 

print_int.o: mylib.c mylib.h 

clean: 
     rm a.out prog.o libmylib.a mylib.o 

Esto dio un error en la línea 2 porque solía espacios en lugar de pestaña.

+3

Hay una pequeña redundancia aquí. Con las bibliotecas estáticas, obtendrá el mismo resultado si solo vincula los archivos '.o' directamente a la aplicación, en lugar de meterlos en un archivo' .a' primero. Una biblioteca estática es poco más que un montón de archivos '.o' pegados, después de todo. –

Respuesta

7

Algo así como:

program_NAME := a.out 

SRCS = mylib.c prog.c 

.PHONY: all 

all: $(program_NAME) 

$(program_NAME): $(SRCS) 
    ar -rcs libmylib.a mylib.o 
    cc -m32 prog.o -L. -lmylib 

podría empezar

más que empezar usando archivos make a mí mismo y creo que son bastante complicado pero una vez que ellos trabajan que hacen la vida mucho más fácil (este pequeños prob lleno de errores, pero algunos de los más experimentados SO popular se prob ser capaz de ayudar a solucionarlos)

cuanto a funcionamiento, asegúrese de guardar el archivo como 'Makefile' (caso es importante)

luego desde la línea de comando (que hace de cd al directorio que contiene el Makefile):

$ make 

eso es todo!

ACTUALIZACIÓN

si la biblioteca estática intermedia es superfluo que podría saltar con un Makefile así:

program_NAME := a.out 

SRCS = mylib.c prog.c 
OBJS := ${SRCS:.c=.o} 

CFLAGS += -m32 

program_INCLUDE_DIRS := 
program_LIBRARY_DIRS := 
program_LIBRARIES := mylib 

CPPFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir)) 
LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir)) 
LDFLAGS += $(foreach library,$(program_LIBRARIES),-l$(library)) 

CC=cc 

LINK.c := $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) 

.PHONY: all 

all: $(program_NAME) 

$(program_NAME): $(OBJS) 
    $(LINK.c) $(program_OBJS) -o $(program_NAME) 
+0

Ninguno de los anteriores Makefiles funciona. –

+0

Proporciona el error Makefile: 25: *** separador faltante. Detener. para el segundo y Makefile: 10: *** separador faltante. Detener. para el primer –

+0

Responda –

0

creo que no existe un procedimiento más detallado que la documentación oficial de la orden make: http://www.gnu.org/software/make/manual/make.html#Overview

Básicamente, usted tendrá que crear un objetivo y sólo hay que poner sus comandos en ella. El objetivo podría ser "todo" si desea que funcione cuando escribe "hacer". Un buen archivo MAKE seguramente usará variables, etc. para mantenerlo flexible sobre las adiciones de lib/sources.

1

El tutorial más sencilla de entender que los archivos está disponible en Cprogramming.com. Una vez que haya terminado de entenderlo, puede ir a través del manual make file.

+1

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la crítica] (/ review/low-quality-posts/19056300) – NaN

Cuestiones relacionadas