1

我正在编写一个小的 C 程序来取乐。我决定只使用 MinGW(仅 C)、make 和 Notepad++ 作为不使用花哨的 IDE 进行更改的练习。到目前为止,一切都很好,很有趣。

(MinGW == 我在 Windows 上工作。)

现在,由于该程序是针对 vanilla CI 编译的,因此想到了使其完全可移植。MinGW make 和 gcc 足够聪明,可以根据规则创建程序:

myprog: myprog.o other.o
    $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@

显然,由于我在 Windows 上,编译器会创建myprog.exe. 这非常聪明,并且使整个东西非常便携。

标准目标而言,我至少想实施clean,因为我实际上使用了该规则。现在,在 Windows 上实际运行的干净目标如下所示:

clean:
   rm myprog.exe *.o

这条规则在 POSIX 环境中肯定行不通,因为程序在那里没有扩展。(PSOIX:想想 GNU/Linux)

有没有一种便携式的方式来实现清洁而不需要太多的麻烦?

到目前为止,我还没有找到任何关于这个问题的真正有用的文档。如果您查看 autoconf 和 automake 是如何解决这个问题的,它们会介绍该模式@EXEEXT@。但这依赖于测试环境的冗长配置代码。

4

2 回答 2

1

If solved it the following way:

UNAME = $(shell uname -o)
ifeq ($(UNAME), Msys)
  EXEEXT = .exe
endif

clean:
    rm *.o myprog$(EXEEXT)

It solved the issue quite nicely. Although it is not totally 100% portable it works most common cases.

于 2012-05-22T08:06:28.230 回答
1

将二进制名称定义为变量(可选地从定义“main()”的源文件的名称中推导出来,使用简单的 egrep 命令):

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)

并使用此宏而不是硬编码名称

于 2012-04-05T08:18:44.627 回答