6

私は小さなプロジェクトをコンパイルしようとしていますが、このエラーが発生しています.

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

私のメイクファイルは次のようになります。

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

router: router.o link_info.o route.o sequence.o
        $(CC) $(FLAGS) $(INC) $^ -o $@

router.o: router.c
        $(CC) -c $(FLAGS) $(INC) $< -o $@

sequence.o: sequence.h sequence.h
        $(CC) -c $(FLAGS) $(INC) $< -o $@

link_info.o: link_info.h link_info.c
        $(CC) -c $(FLAGS) $(INC) $< -o $@

route.o: route.h route.c
        $(CC) -c $(FLAGS) $(INC) $< -o $@

私が混乱しているのは、3 つのオブジェクト ファイルのルールが同じ形式であるということですが、リンク 1 だけが叫ぶのはなぜですか? どうもありがとう!

4

3 に答える 3

5

メイクファイルを少し編集することをお勧めします。

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

router: router.o link_info.o route.o sequence.o
        $(CC) $(FLAGS) $(INC) $^ -o $@

router.o: router.c
        $(CC) -c $(FLAGS) $(INC) $< -o $@

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

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 $@

route.o: route.h route.c //Same as above
        $(CC) -c $(FLAGS) $(INC) $< -o $@
于 2012-11-03T04:31:30.593 に答える
2

最近のバージョンの make では、すべてのオブジェクト ルールを削除できます。これは、make がデフォルトのルールを使用して .c または .cpp ファイルからオブジェクトを構築するためです。ルールをそのままにして、最終的な実行可能ファイルを所定の場所にビルドします。

たとえば、次の行のみが含まれるようにファイルを変更します。

router: router.o link_info.o route.o sequence.o
    $(CC) $(FLAGS) $(INC) $^ -o $@
于 2012-11-03T04:34:42.063 に答える
2

link_info.o をrouter:依存関係のリストの最後に移動すると、代わりに route.o で爆発するのではないかと思います。

ヘッダーを C ファイルとしてコンパイルしているようです。その場合、GCCが何をするのかわかりません。$< を使用してコンパイルするソース ファイルを生成する場合、makefile 規則では、.c ファイルを最初の依存関係にする必要があります。

link_info: および route: ルールでは .c ファイルと .h ファイルが逆になり、sequence: ルールでは .h ファイルが 2 回リストされます。

于 2012-11-03T04:44:45.813 に答える