文件格式无法识别; 作为链接描述文件处理(makefile问题)

use*_*978 5 linker gcc 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
Run Code Online (Sandbox Code Playgroud)

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

usr/bin/ld:file1.o:1: file format not recognized; treating as linker script
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*ski 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
Run Code Online (Sandbox Code Playgroud)

或者,就像EmployedRussian所指出的那样,你可以使用更多的东西来利用GNU make的更多内置功能:

CC=gcc
CFLAGS=-Wall -g -m32

all: exFile

exFile: file1.o file2.o 
        $(LINK.c) $^ -o $@

file1.o: file1.h
Run Code Online (Sandbox Code Playgroud)