2012-08-03 9 views
8

Muszę uruchomić te 4 polecenia na terminalu za każdym razem, gdy chcę uruchomić program przy użyciu bibliotek.Makefile dla biblioteki

Linie są

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

Jak zrobić makefile dla powyższych poleceń i uruchomić go? Szczegółowa procedura byłaby doceniona. Dzięki.


Edit: Oto rozwiązanie:

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 

Dało błąd na linii nr 2, ponieważ użyłem spacji zamiast zakładki.

+3

Tutaj jest trochę nadmiarowości. W przypadku bibliotek statycznych uzyskasz taki sam wynik, jeśli po prostu połączysz pliki '.o' bezpośrednio z aplikacją, zamiast umieszczać je najpierw w pliku' .a'. Biblioteka statyczna to przecież tylko kilka połączonych ze sobą plików '.o'. –

Odpowiedz

7

Coś jak:

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 

może Ci zacząć

dopiero zaczął używać makefile siebie i myślę, że są one dość trudne, ale gdy pojawi się ich pracy robią życie o wiele łatwiejsze (to te, prawdopodobnie pełen błędów, ale niektóre z bardziej doświadczonych użytkowników SO mogą pomóc w ich naprawieniu)

Co do biegu, koniecznie zapisz plik jako "Makefile" (sprawa jest ważna)

następnie od linii cmd (zapewniając swoim CD do dir zawierających Makefile):

$ make 

to wszystko!

UPDATE

jeżeli pośredni biblioteka statyczna jest zbędny można pominąć go z Makefile tak:

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

Żaden z powyższych plików Makefile nie działa. –

+0

Daje błąd Makefile: 25: *** brakujący separator. Zatrzymać. dla drugiego i Makefile: 10: *** brakujący separator. Zatrzymać. dla pierwszego –

+0

Proszę odpowiedzieć na ten –

0

myślę, że nie jest bardziej szczegółowy niż procedura oficjalnej dokumentacji polecenia make: http://www.gnu.org/software/make/manual/make.html#Overview

Zasadniczo trzeba będzie utworzyć cel i po prostu umieścić swoje polecenia w nim. Cel może być "all", jeśli chcesz, aby działał, gdy wpiszesz "make". Dobry plik Makefile z pewnością użyje zmiennych, aby zachować elastyczność w stosunku do dodatków do biblioteki/źródeł.

1

Najprostszym poradnik zrozumieć uczynić plików jest dostępny w Cprogramming.com. Po przejściu przez zrozumienie, możesz przejść do instrukcji obsługi make file.

+1

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić tutaj istotne części odpowiedzi i podać link do odsyłacza. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. - [Z recenzji] (/ opinia/niskiej jakości-posts/19056300) – NaN