2012-08-03 37 views
8

Programları kütüphaneleri kullanarak yürütmek istediğim her defasında bu 4 komutu terminalde çalıştırmam gerekiyor.Bir kütüphane için Makefile

çizgiler nasıl yukarıdaki komutlar için bir makefile yapmak ve onu çalıştırırım

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

nelerdir? Detaylı bir prosedür takdir edilecektir. Teşekkürler.

Düzenleme

: yerine sekme boşluk kullanıldığından

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 

Bu, hat 2 bir hata verir: Burada çözümdür. http://www.gnu.org/software/make/manual/make.html#Overview

Temel olarak bir hedef oluşturmak zorunda kalacak ve hislerin komutları koyun:

+3

Burada biraz fazlalık var. Statik kütüphanelerle, ilk önce bir '.a' dosyasına yerleştirmek yerine' .o' dosyalarını doğrudan uygulamaya yerleştirirseniz aynı sonucu elde edersiniz. Statik bir kütüphane, bir araya gelerek, bir araya getirilmiş bir grup .o'nun dosyalarından biraz daha fazlasıdır. –

cevap

7

şey gibi:

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 

(Eğer

sadece Makefiles kendim kullanmaya başladı ve ben onlar oldukça zor olduğunu düşünüyorum ama bunları çalışır hale kez onlar çok daha kolay bir hayat kurmak başladı bu olanları alabilirsiniz böcek dolu ama daha deneyimli bazı SO halk size 'Makefile' olarak dosyayı emin olun) çalıştıran gelince

bunları düzeltmek yardım edebilmek prob olacaktır prob (olgu

012) önemlidir

cmd hattından (size Makefile'ı içeren dir cd sağlamak):

$ make 

Thats!

ara statik kütüphane böyle bir Makefile ile atlamak gereksiz ise

GÜNCELLEME:

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

Yukarıdaki Makefiles'in hiçbiri çalışmıyor. –

+0

Makefile: 25: *** eksik ayırıcı hatası veriyor. Durdurmak. İkinci ve Makefile için : 10: *** eksik ayırıcı. Durdurmak. İlk –

+0

için Lütfen bu –

0

Ben makyaj komutunun resmi belgelere daha ayrıntılı bir prosedür var olduğunu düşünüyorum. 'Make' yazarken çalışmasını istiyorsanız, hedef 'all' olabilir. İyi bir makefile, lib/kaynak eklentileri üzerinde esnek tutmak için değişkenleri vb. Kullanır.

1

en basit öğretici dosyaları yapmak anlamak için Cprogramming.com mevcuttur. Anlayarak bunu anladığınızda, make file el kitabına geçebilirsiniz.

+1

Bu bağlantı soruyu yanıtlayabilirken, cevabın temel kısımlarını buraya eklemek ve referans için bağlantı sağlamak daha iyidir. Bağlantılı sayfa değiştiğinde yalnızca bağlantı yanıtları geçersiz olabilir. - [Yorum Yaz] (/ review/düşük kaliteli yazılar/19056300) – NaN