8

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

4

2 回答 2

9

您的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
于 2011-04-07T05:47:24.837 回答
1

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

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

于 2011-04-07T04:01:31.900 回答