【问题标题】:File format not recognized; treating as linker script using GCC文件格式无法识别;使用 GCC 将其视为链接描述文件
【发布时间】:2011-07-31 08:15:06
【问题描述】:

我对 Makefiles 很陌生,我正在尝试将一个可执行文件从 3 个文件 file1.c、file2.c 和 file1.h 构建到一个名为 exFile 的可执行文件中。这是我得到的:

all: exFile
exFile: file1.o file2.o 
    gcc -Wall -g -m32 repeat.o show.o -o repeat

file1.o: file1.c file1.h
    gcc -Wall -g -m32 -S file1.c -o file1.o

file2.o: file2.c 
    gcc -Wall -g -m32 -S file2.c -o file2.o

我已经在网上搜索了这种格式的 makefile,但我空手而归,所以我想知道是否有人可以提供帮助。当它尝试编译时,我得到:

usr/bin/ld:file1.o:1: file format not recognized; treating as linker script

我已经使用汇编文件编译了程序,但我不确定如何处理 c 文件或 file1.h 文件。 file1.c 包括 file1.h 所以我必须链接它们(我想?)。任何建议或参考链接将不胜感激

【问题讨论】:

    标签: gcc linker makefile compilation


    【解决方案1】:

    gcc 命令行有两个问题。首先,您要指定-S 标志,这会导致gcc 发出汇编代码,而不是目标代码。其次,您缺少 -c 标志,它告诉 gcc 将文件编译为目标文件,但不链接它。如果您只删除 -S 而不进行其他任何更改,您最终将得到一个名为 file1.o 和另一个名为 file2.o 的可执行程序,而不是两个目标文件。

    除了这些错误之外,您还可以通过使用模式规则来简化您的 makefile。我建议您尝试以下方法:

    all: exFile
    exFile: file1.o file2.o 
        gcc -Wall -g -m32 $^ -o $@
    
    %.o: %.c
        gcc -Wall -g -m32 -c $< -o $@
    
    file1.o: file1.h
    

    或者,正如 EmployedRussian 所指出的,您可以使用更精简的东西,利用 GNU make 的更多内置功能:

    CC=gcc
    CFLAGS=-Wall -g -m32
    
    all: exFile
    
    exFile: file1.o file2.o 
            $(LINK.c) $^ -o $@
    
    file1.o: file1.h
    

    【讨论】:

    • 这个makefile还是很糟糕。你不需要模式规则——make 有一个就像它已经内置的一样。另外,exFile 总是过时的,因为你正在构建“重复”。如果您提供了如何更正 makefile 的示例,请做得更好!
    • @Employed 俄语:哎呀,感谢您发现那个错字(从 OP 复制)。至于简化 makefile,是的,它可能更简单,但我不确定这样做是否有助于 OP 的理解,因为它不是导致问题的 makefile 结构。
    【解决方案2】:

    -S 切换到 gcc 告诉它输出汇编程序,因此:

    gcc -Wall -g -m32 -S file1.c -o file1.o
    

    正在将汇编程序放入file1.o,但您可能希望将file1.c 编译为目标代码:

    gcc -Wall -g -m32 file1.c -o file1.o
    

    当链接器获取您的 file1.o 时,它会感到困惑,因为当链接器需要目标代码时,file1.o 是汇编程序,因此会出现错误。

    所以去掉-S 开关file1.ofile2.o

    【讨论】:

    • 感谢您的回复,但仍然没有运气...遇到同样的错误。我完全被这件事难住了。我会更多地研究它,我知道我离得不远,可能只是我忽略了一些细节。
    • @user695978:如果您file file1.o 获取文件类型会怎样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2021-02-03
    • 1970-01-01
    相关资源
    最近更新 更多