2012-11-03 35 views
5

Derlenmiş küçük bir proje almaya çalışıyorum ama bu hatayı alıyorum, etrafta arama yaptım ve bu hatayı çoğunlukla yanlış dosya uzantısı nedeniyle aldım ama 't gerçekten burada neden olduğunu düşünüyorum:gcc - dosya tanınmadı: Dosya biçimi tanınmadı

gcc -c -W -Wall -ggdb -I. router.c -o router.o 
router.c:106: warning: unused parameter ‘hname’ 
router.c: In function ‘flood_neighbors’: 
router.c:464: warning: unused variable ‘bytes_rcvd’ 
router.c: At top level: 
router.c:536: warning: unused parameter ‘fd’ 
gcc -c -W -Wall -ggdb -I. link_info.h -o link_info.o 
gcc -c -W -Wall -ggdb -I. route.h -o route.o 
gcc -c -W -Wall -ggdb -I. sequence.h -o sequence.o 
gcc -W -Wall -ggdb -I. router.o link_info.o route.o sequence.o -o router 
link_info.o: file not recognized: File format not recognized 
collect2: ld returned 1 exit status 
make: *** [router] Error 1 

ve benim yapma dosyasıdır gibi görünüyor: aynı biçimi olan

CC = gcc 
INC = -I. 
FLAGS = -W -Wall -ggdb 

router: router.o link_info.o route.o sequence.o 
     $(CC) $(FLAGS) $(INC) $^ -o [email protected] 

router.o: router.c 
     $(CC) -c $(FLAGS) $(INC) $< -o [email protected] 

sequence.o: sequence.h sequence.h 
     $(CC) -c $(FLAGS) $(INC) $< -o [email protected] 

link_info.o: link_info.h link_info.c 
     $(CC) -c $(FLAGS) $(INC) $< -o [email protected] 

route.o: route.h route.c 
     $(CC) -c $(FLAGS) $(INC) $< -o [email protected] 

Üstüne karıştı üç nesne dosyaları için kurallar olmakla Neden sadece bir link? Çok teşekkürler!

cevap

4

Makefile'de birkaç değişiklik önermek istiyorum. yapmak .c veya .cpp dosyalarından bir nesne oluşturmak için varsayılan bir kural kullanması nedeniyle tüm nesne kurallarını kaldırabilirsiniz yapmak son sürümlerinde ile

CC = gcc 
INC = -I. 
FLAGS = -W -Wall -ggdb 

router: router.o link_info.o route.o sequence.o 
     $(CC) $(FLAGS) $(INC) $^ -o [email protected] 

router.o: router.c 
     $(CC) -c $(FLAGS) $(INC) $< -o [email protected] 

sequence.o: sequence.h sequence.h //Where is the c file ? 
     $(CC) -c $(FLAGS) $(INC) $< -o [email protected] 

link_info.o: link_info.h link_info.c //Change the order. Put c file first and then the header 
     $(CC) -c $(FLAGS) $(INC) $< -o [email protected] 

route.o: route.h route.c //Same as above 
     $(CC) -c $(FLAGS) $(INC) $< -o [email protected] 
+0

Bu işe yarıyor, teşekkürler! Dürüstlükle burada sipariş meselelerini bilmiyordum .. – lzt

+0

Makefile için birkaç düzenleme konusunda - makefile'de hedeflerimden birini yapmayı unutmuşum ve benim eski .o bozuktu, bu yüzden sorun. Bazen bu şeylerin çözümleri mega basit! –

1

. Kuralı, son yürütülebilir dosyayı yerinde oluşturmaya bırakın. yalnızca bu hat içerecek şekilde

Örneğin, dosyayı değiştirin: router: bağımlılıkları listenin sonuna link_info.o

router: router.o link_info.o route.o sequence.o 
    $(CC) $(FLAGS) $(INC) $^ -o [email protected] 
1

Taşı ve sana route.o üzerinde patlatmak edeceğiz şüpheli yerine.

Başlıkları C dosyası olarak derliyorsunuz. Bu durumda GCC’nin ne yaptığı hakkında hiçbir fikrim yok. Makefile kurallarınızda, derlenecek kaynak dosyasını oluşturmak için $ < kullanacaksanız, .c dosyası ilk bağımlılık olmalıdır.

Link_info: ve route: rules, .c ve .h dosyalarının tersine çevrildiğini ve sıralamanın: rule, .h dosyasını iki kez listeler!

+0

Başlık dosyaları doğrudan derlenemeyen c dosyalarında yer almalıdır. –

İlgili konular