我是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所以我必须链接它们(我想?)。任何建议或参考链接将不胜感激
答案 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
是汇编程序,因此你的错误。
所以摆脱-S
和file1.o
的{{1}}开关。