当我为学校项目的Windows编写C makefile时,我真的很绝望。我已经写了我的makefile并用于ubuntu,它的工作原理如下:
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上,您希望编译器产生一个名为freq.exe
的文件(或者无论如何测试系统都可以),但是您发出的命令却告诉GCC发出一个名为freq
的文件。后者对于Linux来说似乎很自然,因此您的构建在那里按预期工作也就不足为奇了。
使用相同的makefile支持不同的OS系列非常棘手,这就是为什么发明了诸如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
的目标的先决条件而声明为“ phony”。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