【问题标题】:gcc - file not recognized: File format not recognizedgcc - 文件无法识别:文件格式无法识别
【发布时间】:2012-11-03 04:13:42
【问题描述】:

我正在尝试编译一个小项目,但遇到了这个错误,我一直在四处寻找,人们得到这个错误主要是因为文件扩展名不正确,但我真的不认为这是原因:

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

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

【问题讨论】:

    标签: c makefile


    【解决方案1】:

    我想建议对您的 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 $@
    

    【讨论】:

    • 关于对 makefile 进行一些编辑的主题 - 我完全忘记在我的 makefile 中创建我的目标之一,并且我的旧 .o 已损坏,因此出现了问题。有时这些问题的解决方案非常简单!
    【解决方案2】:

    使用最新版本的 make 您可以删除所有对象规则,因为 make 使用默认规则从 .c 或 .cpp 文件构建对象。只需保留规则即可构建最终的可执行文件。

    例如,更改文件,使其仅包含这一行:

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

    【讨论】:

      【解决方案3】:

      将 link_info.o 移动到 router: 依赖项列表的末尾,我怀疑你会在 route.o 上炸毁。

      您似乎正在将标头编译为 C 文件。我不知道 GCC 在这种情况下会做什么。在您的 makefile 规则中,如果您要使用 $

      link_info: 和 route: 规则将 .c 和 .h 文件颠倒过来,而 sequence: 规则将 .h 文件列出两次!

      【讨论】:

      • 头文件应该包含在c文件中,不能直接编译。
      猜你喜欢
      • 1970-01-01
      • 2018-02-15
      • 1970-01-01
      • 2021-01-13
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      相关资源
      最近更新 更多