2016-03-23 23 views
0

değiştirdikten sonra Bunlar benim dosyalardır işe yaramadı: add.c add.h main.c makefileYap Dosyamı

Bu makefile geçerli: Sonra ana değiştirdikten sonra

main:main.o add.o 
    gcc -o main main.o add.o 
main.o:$(@:%.o=%.c) 
    gcc -o main.o -c main.c 
add.o:$(@:%.o=%.c) $(@:%.o=%.h) 
    gcc -o add.o -c add.c 
.PHONY:clean 
clean: 
    rm *.o -rf 
    rm main -rf 

. c ve yap. Ama bana şunu söyledin: make: `main 'güncel.

benim makefile değiştirirseniz: Sonra main.c değiştirip yaptıktan sonra

main:main.o add.o 
    gcc -o main main.o add.o 
main.o:main.c 
    gcc -o main.o -c main.c 
add.o:$(@:%.o=%.c) $(@:%.o=%.h) 
    gcc -o add.o -c add.c 
.PHONY:clean 
clean: 
    rm *.o -rf 
    rm main -rf 

. Çalışabilir. Nedeni bilmiyorum.

main.o:$(@:%.o=%.c) 
add.o:$(@:%.o=%.c) $(@:%.o=%.h) 

yılında

+0

Sözdizimi 'main.o: $ (@:%. O =%. C)' yapmak için gerekeni yapmaz. $% 'Nin'% .c' ile '% .o 'karakterlerini değiştirir. $ @ 'Değerlendirildiğinde, 'main.o'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'yı içermediğinde, makro bir şey yapmasını engeller. ".o" ile ".o" yerine "ana .o: $ (@: o. –

+0

"echo" $ (@:%. O =%. C) "' yazarak bir eylem satırı olarak tesadüfen gösterebilirsiniz. –

+0

'echo" $ (@:%. O =%. C) "' düzeltmeyi gösterdi. (Main.c) Bunu yapmaya çalıştım. Ama işe yaramadı. – JCRunner

cevap

1

bağımlılıkları geçerli yapmak sözdizimi değildir.

bir desen (jenerik) kuralına bu iki kuralı değiştirin: C programları

Derleme:

%.o : %.c 
    gcc -c -o [email protected] ${CPPFLAGS} ${CFLAGS} $< 

yukarıdaki kural aslında .c den .o dosyalarını derlemek için built-in rule çok benzer

n.o,formunun bir tarifi ile n.c'dan otomatik olarak yapılır.. Başka bir deyişle

, sen main.o ve add.o için orijinal kurallarını kaldırabilir ve doğru inşa etmeliyiz.

+0

Orijinal kurallarimi main.o ve add.o için kaldırmaya çalıştım ve doğru şekilde oluşturuldu. Ama neden bağımlılıklarını neden ' ana.o: $ (@:%. O =% .c) add.o: $ (@:%. O =% .c) $ (@:%. o =% .h) ' geçerli bir sözdizimi değildir. "$ (@:%. O =%. C)" değişkenini yazdırmaya çalıştım ve doğru değeri (main.c) gösteriyor. main: $ (@:%. O =%. C) $ (uyarı $ (@:%. O =%. C)) gcc -o ana main.o add.o – JCRunner

+0

@JCRunner Otomatik değişkeni kullanmak için önkoşullarda [ikincil genişletme özelliğini] açıkça etkinleştirmeniz gerekir (https://www.gnu.org/software/make/manual/make.html#Secondary-Expansion) ve dolarlarınızı ikiye katlayın. –

+0

Bunu yapmaya çalıştım: '.SECONDEXPANSION: main.o: $$ ($ @:%. O =%. C) gcc -o main.o -c main.c 'ama yaptığımda: '*** hedef desen% yok' içeriyor. Dur, neden **? – JCRunner