首页 > 解决方案 > 为 Windows 编写正确的 Ansi C makefile

问题描述

尝试为我的学校项目编写 Windows 的 C makefile 时,我真的很绝望。我已经为 ubuntu 编写并使用了我的 makefile,它的工作原理是这样的:

all: clean install

install: dynarr.o broadcaster.o main.o
    gcc -o freq dynarr.o broadcaster.o main.o

clean:
    rm -f *.o

dynarr.o:
    gcc -c dynarr.c

broadcaster.o:
    gcc -c broadcaster.c

main.o:
    gcc -c main.c

我已经在各个网站上尝试了大约 10 个教程,这让我很紧张。我需要以这个特定的顺序编译dynarr.c broadcaster.c main.c并且输出应该是freq.exe。学校服务器上的编译器对于两个版本(linux 和 windows)都是 gcc。请帮我。

编辑:出于某种原因,我们老师的在线验证器需要 windows 和 linux 的 freq.exe,他没有费心在任何地方提及它。我必须编辑的所有内容freq都是freq.exe. 谢谢你的支持。

标签: cwindowsmakefilecompilation

解决方案


在 Windows 上,您希望编译器生成一个名为freq.exe(或者测试系统无论如何都会生成)的文件,但是您发出的命令告诉 GCC 生成一个名为 just 的文件freq,而不是。后者对于 Linux 来说似乎很自然,因此您的构建在那里按预期工作也就不足为奇了。

使用相同的 makefile 支持不同的操作系统系列是很棘手的,这就是发明 Autotools 和 CMake 等实用程序的原因。假设您只需要一个适用于 Windows 的 Makefile,这个变体就足够了:

all: clean install

install: dynarr.o broadcaster.o main.o
    gcc -o freq.exe dynarr.o broadcaster.o main.o

clean:
    rm -f *.o

dynarr.o:
    gcc -c dynarr.c

broadcaster.o:
    gcc -c broadcaster.c

main.o:
    gcc -c main.c

话虽如此,我有一些进一步改进的建议:

  1. 构建特定输出文件的规则应将该文件命名为其目标。
  2. 相反,与由该规则创建的文件不对应的规则目标应通过将它们命名为名为.PHONY.
  3. 按照惯例,“安装”目标将构建文件从其构建位置复制到永久系统位置。您的安装规则和 makefile 中的任何其他内容都不会这样做,因此您可能不需要“安装”目标。
  4. 在构建之前清理默认目标的规则可能是有意的,但这是不正常的,因为它首先破坏了使用的主要原因之一make:避免不必要的工作。
  5. 这是一种很好的形式,它可以防止错误使用 Make 的自动变量来避免在规则中重复自己。
  6. 存在一些意见分歧,但我认为普遍的共识是clean目标应该清理所有构建的对象,而不仅仅是中间对象。

应用所有这些将产生一个像这样的makefile:

all: freq.exe

freq.exe: dynarr.o broadcaster.o main.o
    gcc -o $@ $^

clean:
    rm -f freq.exe *.o

dynarr.o:
    gcc -c dynarr.c

broadcaster.o:
    gcc -c broadcaster.c

main.o:
    gcc -c main.c

.PHONY: all clean

就个人而言,我还建议为可执行目标(这将更容易在 Windows 和 Linux / macOS 之间调整 makefile)和所需的目标文件(这是典型的,这将使clean目标更精确)引入变量)。您还可以考虑依赖 Make 的内置规则来从 .c 文件构建 .o 文件,因为您使用的显式规则不会做任何内置规则没有完成的事情。结果可能是:

PROG = freq.exe
OBJS = dynarr.o broadcaster.o main.o

all: $(PROG)

$(PROG): $(OBJS)
    gcc -o $@ $^

clean:
    rm -f $(PROG) $(OBJS)

# Relies on the built-in rules for building object files from C sources

.PHONY: all clean

推荐阅读