我正在写一个小C程序以获得乐趣。我决定只使用MinGW(只有C),make和Notepad ++作为练习,不使用花哨的IDE进行更改。到目前为止一切都很好玩。
(MinGW ==我在Windows上工作。)
现在,由于程序编译反对vanilla C,我想让它完全可移植。 MinGW make和gcc足够聪明,可以根据规则创建一个程序:
myprog: myprog.o other.o
$(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@
显然,由于我在Windows上,编译器会创建myprog.exe
。这非常聪明,使整个过程非常便携。
就standard targets而言,我希望至少实现clean
,因为我实际上使用了该规则。现在,实际在Windows上运行的干净目标如下所示:
clean:
rm myprog.exe *.o
此规则肯定不适用于POSIX环境,因为程序在那里没有扩展。 (PSOIX:想想GNU / Linux)
是否有一种便携式方式可以实现干净而不需要多付费?
到目前为止,我还没有找到任何有关此问题的实用文档。如果你看一下autoconf和automake如何解决这个问题,他们会介绍模式@EXEEXT@
。但这依赖于冗长的配置代码测试环境。
答案 0 :(得分:1)
将二进制名称定义为变量(可选择使用简单的egrep命令从定义“main()”的源文件的名称中推导出来):
EXE_EXT_LINUX:=
EXE_EXT_WINDOWS:=exe
EXE_EXT:=$(EXE_EXT_$(PLATF))
BINARY_NAME:=$(notdir $(basename $(shell egrep -r -l --include=*.cpp '^[ \t]*?int[ \t]*?main[ \t]*?\(') ) )$(EXE_EXT)
并使用此宏而不是硬编码名称
答案 1 :(得分:1)
如果按以下方式解决:
UNAME = $(shell uname -o)
ifeq ($(UNAME), Msys)
EXEEXT = .exe
endif
clean:
rm *.o myprog$(EXEEXT)
它很好地解决了这个问题。虽然它不是完全100%便携,但它最常见的情况。