2016-03-21 18 views
0

Ben iki kez aynı dosyayı derlemeye çalışırken bir ilgisi olduğunu tahmin ama nasıl bilmiyorum Şimdi hatayıgcc geçersiz komut satırı seçenekleri

cannot specify -o with -c, -S or -E with multiple files" 

alınan .

structs.h is included in utils.c, 
utils.c is included in utils.h, 
utils.h is included in assembler.c, 
assembler.c is included in assembler.h, 
assembler.h is included in main.c. 

(:, benim kod oluşumunda yaptırdı neden bilmiyorum ...

+0

belirtme birden kaynak dosyaları sadece mantıklı çağrılmalı. – EOF

+0

başlıklarını "derlemeyin", onları derleme komutundan çıkarmayın, ama gerçekten de bağımlılıkları – Guiroux

+0

BTW: _utils.c, utils.h_ içinde bulunur ve _assembler.c assembler.h_ içinde bulunur. duygusu. .h dosyaları .c dosyalarına dahil edilmiştir, ancak diğer yollardan değil. –

cevap

0

Sen probbaly (sadece gcc komutları dosyaları .h kaldırmak) bu makefile gerekir:

assembler : main.o assembler.o utils.o 
    gcc -g -ansi -Wall -pedantic -lm main.o assembler.o utils.o -o assembler 

main.o : main.c assembler.h utils.h 
    gcc -c -ansi -Wall -pedantic main.c -o main.o 

assembler.o : assembler.c 
    gcc -c -ansi -Wall -pedantic assembler.c -o assembler.o 

utils.o : utils.c structs.h 
    gcc -c -ansi -Wall -pedantic utils.c -o utils.o 
+1

main.c'yi derleyen ve assembler.c ve utils.c satırları için benzer olan satırda "-lm" veya "-o main.o" ifadelerini içermemelidir. – FredK

0

Sizin makefile yanlış tüm ekliyor

assembler : main.o assembler.o utils.o 
    gcc -g -ansi -Wall -pedantic -lm main.o assembler.o utils.o -o assembler 
main.o : main.c assembler.h utils.h 
    gcc -c -ansi -Wall -pedantic -lm main.c assembler.h utils.h -o main.o 
assembler.o : assembler.c 
    gcc -c -ansi -Wall -pedantic -lm assembler.c -o assembler.o 
utils.o : utils.c structs.h 
    gcc -c -ansi -Wall -pedantic -lm utils.c structs.h -o utils.o 

Dosyalar olan böyle kapsamaktadır Sadece birincisi yerine derleme komutuna olan bağımlılıklar: Sonuç olarak, başlık dosyalarını çeviri birimleri olarak derlemeyi deniyorsunuz, bu uygun değildir. Tüm bağımlılıkları, birden çok nesne dosyasını bir yürütülebilir dosyada birleştiren bağlantı komutuna ekleyin. Ancak, hata iletisinin gösterdiği gibi, -c seçeneğiyle bir nesne dosyası oluştururken, birden fazla kaynak dosyası sağlamayacak.

Bu yüzden derleme tarifleri $< (ilk bağımlılık) kullanır, bağlantı tarifi ise $^ (tüm bağımlılıklar) kullanır. Kullanım kılavuzunun automatic variables chapter numaralı sayfasına bakın.

0

Belki daha iyi bir yolu: bağlayıcı olacak eğer

assembler:: main.o assembler.o utils.o 
    gcc -o [email protected] main.o assembler.o utils.o -lm 
.c.o: 
    gcc -c -g -ansi -Wall -pedantic $*.c 
İlgili konular