C++生成文件问题
A C++ makefile issue
我最近开始使用这个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。
所以,这是显然发生的第一件事。然后,您的生成文件在某个时候执行:
rm -f *.log
当然,这会愉快地删除刚刚创建的build.log
文件。记住计算机编程的黄金法则:计算机总是完全按照你告诉它做的事情,而不是你想要它做的事情。您告诉计算机:首先,创建一个名为build.log
的文件,然后:其次,删除所有名为*.log
的文件;您的计算机认真地遵循了您的指示。
附言此时,标准输出和错误仍重定向到此现已删除的文件;所以,基本上,一切都消失在空白中(请原谅C++双关语),再也看不到了。
有几种可能的解决方法,而最佳解决方法取决于您以这种方式执行操作的原始目的。一些选项是:
1) 使用其他扩展名,例如build.out
,用于捕获的标准输出或错误。
2)使rm
命令更智能,并排除此特定文件,但删除所有其他*.log
文件。
3)使rm
命令更加智能,并使其仅删除早于某个预定间隔的*.log
文件。使用此方法,build.log
上的当前时间戳将防止其被删除。
取决于你想做什么,但这是你所看到的行为的解释。
- 使用mongocxx驱动程序时包含头文件问题
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 编译要在英特尔Hyperscan中使用的.cc文件时出现问题
- 使用 seekg() 读取C++中的文件时出现问题
- sqlite3 和生成文件中的链接出现问题
- C++头文件和类实现出现问题
- 用户输入字符串的文件附加问题..C++
- node-gyp 的先有鸡还是先有蛋的问题:指向依赖项中的头文件
- 读取文件并将其存储在unordered_map中时出现问题
- 编译 llvm 插件时出现问题:llvm/Config/llvm-config.h:没有这样的文件或目录
- 我在使用C++文件时遇到了一些问题
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- 将文件复制到自定义位置,存在字符串转换问题
- DirectX12 的问题:"d3dApp.h":没有这样的文件或目录
- (ODR 使用问题)在不同文件中priority_queue名称相同的结构
- C++模板编程设计问题 - 根据输入文件返回不同的类型
- 读取制表符分隔的文件时出现问题 C++
- 当我在 CLion 中读取数组中的 txt 文件时C++编码问题
- 使用 RapidXML 解析大型 XML(大小大于 65 KB)文件时出现问题
- C++:读取.BMP文件时出现问题;文件结束时间早于预期