2012-11-03 16 views
5

Próbuję skompilować mały projekt, ale otrzymuję ten błąd, szukałem w pobliżu, a ludzie dostają ten błąd głównie z powodu nieprawidłowego rozszerzenia pliku, ale ja „t naprawdę myślę, że to przyczyna tutaj:gcc - plik nie został rozpoznany: nie rozpoznano formatu pliku

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 

i mój plik make wygląda następująco:

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] 

Co jestem zdezorientowany na to zasady trzech plików obiektowych są tego samego formatu, ale dlaczego tylko link krzyczy? Wielkie dzięki!

Odpowiedz

4

Chciałbym zasugerować kilka zmian w pliku makefile.

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

To działa, dziękuję! Szczerze mówiąc, nie znałem tutaj kwestii porządkowych. – lzt

+0

Na temat kilku edycji plików Makefile - zapomniałem w ogóle zrobić jeden z moich celów w moim pliku Makefile, a mój stary .o był uszkodzony, stąd problem. Czasami rozwiązania tych rzeczy są mega proste! –

1

Z ostatnich wersjach dokonać można usunąć wszystkie reguły obiektu, ponieważ make wykorzystuje domyślną regułę aby zbudować obiekt z .c lub .cpp plików. Po prostu pozostaw regułę do zbudowania ostatecznego pliku wykonywalnego.

Na przykład, zmienić plik zawiera więc tylko ta linia:

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

Move link_info.o na końcu listy w router: zależnościami i podejrzewam, że będziesz wysadzić na route.o zamiast.

Wydaje się, że kompilujesz nagłówki jako pliki C. Nie mam pojęcia, co GCC robi w tym przypadku. W regule makefile plik .c musi być pierwszą zależnością, jeśli zamierzasz użyć $ < do wygenerowania pliku źródłowego do kompilacji.

The link_info: and route: rules mają odwrócone pliki .c i .h, a sekwencja: rule wyświetla dwukrotnie plik .h!

+0

Pliki nagłówkowe powinny być zawarte w plikach c, a nie bezpośrednio skompilowane. –

Powiązane problemy