忍者构建系统 + gcc/clang 不输出诊断颜色
Ninja Build System + gcc/clang doesn't output diagnostic colors
在C或C++(因此两个标记(项目上调用ninja
时,使用clang
或gcc
编译器,输出不使用ANSI颜色。
例如:
error
应该是红色的,但不是。warning
应该是黄色/橙色,但不是。
所有的东西都是一样的颜色,真的很难判断发生了什么!
为什么会发生这种情况
之所以会发生这种情况,是因为ninja
在内部创建了一个pipe()
,来自编译器的stdout和stderr(在本例中为gcc或clang(将被重新路由。这使得gcc和clang内部的检查失败,后者检查终端(可能支持颜色(。
检查(如isatty(stdout)
(不会返回管道的true
,即使该管道随后再次转发到stdout。
有文件记录
Ninja的常见问题解答在GitHub.com上谈到了这一点,但该常见问题解答未包含在软件中,--help
中未提及,没有忍者手册页,常见搜索引擎(ddg、谷歌(似乎没有找到与颜色相关的常见搜索查询的常见问题。
因此,这篇文章,因为SO有很好的SSO。
修复
将-fdiagnostics-color=always
添加到C或CXX标志中。例如,使用cmake,可以附加-DCMAKE_CXX_FLAGS=-fdiagnostics-color=always
(或CMAKE_C_FLAGS
表示C((或者,如果使用的是cmake 3.24或更高版本,则可以使用CMAKE_COLOR_DIAGNOSTICS
变量或环境变量(。
这适用于gcc(如手册页中所述(和clang(clang的手册页没有提到这个选项,但它包含在llvm.org上的命令行参考中。
作为永久性修复,您可以将以下内容附加到.zshrc
、.bashrc
或类似内容中:
# force C colored diagnostic output
export CFLAGS="${CFLAGS} -fdiagnostics-color=always"
# force C++ colored diagnostic output
export CXXFLAGS="${CXXFLAGS} -fdiagnostics-color=always"
export CCFLAGS="${CCFLAGS} -fdiagnostics-color=always"
# force C, C++, Cpp (pre-processor) colored diagnostic output
export CPPFLAGS="${CPPFLAGS} -fdiagnostics-color=always"
只有当您知道永远不需要将编译器的输出管道传输到其他地方时,才应该这样做。此外,这只适用于clang和gcc,以及其他支持这一功能的编译器,所以请确保不要使用受此标志影响的编译器。
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 为什么rk4.do_step不输出C++中的初始条件
- 输出没有重复元素的动态数组(收缩数组)C++
- 如何根据单词在文本中出现的概率输出单词