文件格式无法识别;使用GCC作为链接描述文件处理

时间:2011-04-07 03:31:26

标签: gcc linker makefile compilation

我是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所以我必须链接它们(我想?)。任何建议或参考链接将不胜感激

2 个答案:

答案 0 :(得分:6)

您的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

答案 1 :(得分:0)

-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是汇编程序,因此你的错误。

所以摆脱-Sfile1.o的{​​{1}}开关。