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

我的make文件看起来像:

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

我感到困惑的是三个目标文件的规则格式相同,但为什么只有一个链接会大喊大叫?非常感谢!

4

3 回答 3

5

我想建议在您的 makefile 中进行一些编辑。

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 文件两次!

于 2012-11-03T04:44:45.813 回答