如何避免在 Windows 和 Linux 中使用不同名称的目标进行重建?

Posted

技术标签:

【中文标题】如何避免在 Windows 和 Linux 中使用不同名称的目标进行重建?【英文标题】:How to avoid rebuilding in targets with different names in Windows and Linux? 【发布时间】:2017-04-28 21:02:37 【问题描述】:

我的 makefile 中有这个

myfile: $(OBJECTS)
    g++ -o $@ $^

这应该转换成类似的东西

g++ -o myfile XXX.o YYY.o ZZZ.o

但这会在 Windows 和 Linux 中产生不同的输出

Windows: myfile.exe

Linux: myfile.out

所以当我再次运行make 时,它将重建(即使没有更改),因为目标名称是myfile 而不是myfile.exemyfile.out。当然,我尝试在 Windows 上使用myfile.exe 作为目标名称,它会显示我想要的最新无事可做消息。

我该如何解决这个问题,以便 Make 找到 myfile.exe|out 并决定不重建它?

【问题讨论】:

嗯,如果您正在构建或为不同的操作系统构建,则需要重新构建所有内容。还是我误解了这个问题? 当然可以,但是如果我在同一个平台上再次重建,它将在没有up to date 的情况下再次重建。 Linux 上应该只产生myfile 而不是myfile.out 是您的确切makefile 条目吗? @Galik 不管 Linux 产生什么,在 Windows 上它总是会重建它,因为它只需要 myfile.exe 而不是其他任何东西 您在 Windows 上使用的是哪个编译系统。 【参考方案1】:

Windows 上的 GCC 会在链接时自动将 .exe 附加到输出文件名,尝试类似

ifneq ($(findstring mingw,$(MAKE_HOST)),)
exe := .exe
endif

myfile$(exe): $(OBJECTS)
    g++ -o $@ $^

或者正如 cmets 所说,对所有平台使用 .exe。

【讨论】:

以上是关于如何避免在 Windows 和 Linux 中使用不同名称的目标进行重建?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免 DirectSound 中的失真和卡顿?

如何避免学习linux必然会遇到的几个问题

如何避免学习linux必然会遇到的几个问题

如何避免学习linux必然会遇到的几个问题

Linux 用户应该使用哪种 IDE/编译器组合在 Windows 上构建 Qt 应用程序,同时避免使用 MS Visual Studio?

如何避免在 Windows 中过度填充 PATH 环境变量?