gpt4 book ai didi

c++ - C++ makefile 问题

转载 作者:太空狗 更新时间:2023-10-29 21:31:48 24 4
gpt4 key购买 nike

我最近开始使用这个 makefile(改编自网络)来构建我的 C++ 代码:

a.exe:  main.o
g++ $(CFLAGS) -o $@ $^
main.o: main.cpp code.hpp
CFLAGS=-ggdb -std=c++17 -Wall -Werror=pedantic -Wextra

#-------------------------------------------------------------

run: a.exe
./a.exe

clean:
rm -f *.o
rm -f *.exe
rm -f *.gch
rm -f *.log

build: clean a.exe

%.o: %.cpp
g++ $(CFLAGS) -c $<

#====================================================

在我的 .bashrc 文件中,我使用以下别名:

alias mkbld='make build >& build.log'

当我在命令行上执行上面的别名时,我看到 makefile 中指定的 clean before build 首先删除了当前工作目录中的所有相关文件,并且这些文件作为构建的一部分重新生成。但是,不会重新生成文件 build.log。我想构建逻辑之前的清理也应该以同样的方式应用到这个文件(尽管这个文件本身不是构建的),因为每次构建日志都写入这个文件,并且每次都应该重新创建它时间。

知道为什么这没有发生吗?

最佳答案

什么时候

make build >& build.log

通过您的 shell 别名执行;但是 shell 首先创建 build.log 文件,然后执行 make 并将其标准输出/错误重定向到该文件。是创建文件和设置重定向的 shell。

所以,这显然是第一件事。然后,您的 Makefile 在某个时候执行:

rm -f *.log

当然,这会愉快地删除刚刚创建的 build.log 文件。记住计算机编程的黄金法则:计算机将始终完全按照您的指示执行,而不是您希望它执行的操作。您告诉计算机:首先,创建一个名为 build.log 的文件,然后:其次,删除所有名为 *.log 的文件;并且您的计算机会认真按照您的指示进行操作。

附言此时,标准输出和错误仍然重定向到这个现在已删除的文件;所以,基本上,一切都消失了(请原谅 C++ 双关语),再也见不到了。

有几种可能的解决方法,最好的解决方法取决于您这样做的最初目的。一些选项是:

1) 为捕获的标准输出或错误使用一些其他扩展,例如 build.out

2) 使rm 命令更智能,并排除该特定文件,但删除所有其他*.log 文件。

3) 使 rm 命令更加智能,让它只删除早于某个预定时间间隔的 *.log 文件。使用这种方法,build.log 上的当前时间戳将防止它被删除。

取决于您想做什么,但这是对您所看到的行为的解释。

关于c++ - C++ makefile 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57193402/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com