c - 为 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
. 谢谢你的支持。
解决方案
在 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
话虽如此,我有一些进一步改进的建议:
- 构建特定输出文件的规则应将该文件命名为其目标。
- 相反,与由该规则创建的文件不对应的规则目标应通过将它们命名为名为
.PHONY
. - 按照惯例,“安装”目标将构建文件从其构建位置复制到永久系统位置。您的安装规则和 makefile 中的任何其他内容都不会这样做,因此您可能不需要“安装”目标。
- 在构建之前清理默认目标的规则可能是有意的,但这是不正常的,因为它首先破坏了使用的主要原因之一
make
:避免不必要的工作。 - 这是一种很好的形式,它可以防止错误使用 Make 的自动变量来避免在规则中重复自己。
- 存在一些意见分歧,但我认为普遍的共识是
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
推荐阅读
- c++ - C++ CDB 调试器问题
- php - Foreach 上升 1 php
- c# - 为什么我的对象在 transform.Translate 上没有停止移动?
- swift - 如何消除“变量未使用”警告并保持强引用?
- python - 如何在查询中向 SQLAlchemy 中已定义的关系添加约束或谓词?
- mongodb - 如何使用 go 和 mongodb 在 heroku 上部署应用程序而不会出错?
- javascript - 从外部 Windows 应用程序拖放到 IE HTML 页面 - 如何进行复制,而不是移动
- c++ - 使用自动时没有数组边界检查
- python - 如何在healpy中旋转整个healpix贴图?
- html - Vue.js 有条件的 if else