如何将编译器的所有输出捕获到文件中?

问题描述 投票:0回答:11

我正在 Linux 中从源代码 (CPP) 构建一个开源项目。这是顺序:

$CFLAGS="-g Wall" CXXFLAGS="-g Wall" ../trunk/configure --prefix=/somepath/ --host=i386-pc --target=i386-pc
$make

编译时我收到很多编译器警告。我想开始修复它们。我的问题是如何在文件中捕获所有编译器输出?

$make > file
没有完成这项工作。它只是像
g++ -someoptions /asdf/xyz.cpp
一样保存编译器命令我想要这些命令执行的输出。

linux shell g++ makefile io-redirection
11个回答
126
投票

编译器警告发生在

stderr
,而不是
stdout
,这就是为什么当您将
make
重定向到其他地方时看不到它们的原因。相反,如果你使用 Bash,试试这个:

$ make &> results.txt

&
的意思是“将 stdout 和 stderr 重定向到这个位置”。其他 shell 通常具有类似的结构。


27
投票

在 bourne shell 中:

制作 > my.log 2>&1

即> 重定向 stdout,2>&1 将 stderr 重定向到与 stdout 相同的位置


27
投票

到目前为止有很多好的答案。这是一个褶边:

$ make 2>&1 | tee filetokeepitin.txt 

会让你看到输出滚动过去。


7
投票

输出到标准错误。使用

2>
捕捉它。

$make 2> file

6
投票

假设您想从构建输出中突出显示警告和错误:

make |& grep -E "warning|error"

4
投票

基于@dmckee 之前的回复

make | tee makelog.txt

这让你在编译时实时滚动输出,并同时写入 makelog.txt 文件。


3
投票

尝试

make 2> file
。编译器警告出现在标准错误流上,而不是标准输出流上。如果我的建议不起作用,请查看您的 shell 手册以了解如何转移标准错误。


3
投票

来自http://www.oreillynet.com/linux/cmd/cmd.csp?path=g/gcc

> 字符不会重定向 标准错误。这很有用,当你 想要保存合法输出而不 用错误消息弄乱文件。 但是如果错误信息是 你想保存什么?这是相当 在故障排除期间很常见。这 解决方案是使用大于号 后跟一个&符号。 (这 几乎每一个现代建筑工程 UNIX shell。)它同时重定向 标准输出和标准 错误。例如:

$ gcc invinitjig.c >& error-msg

看看那里,如果这有帮助: 另一个论坛


2
投票

C壳中 - 符号在大于号之后

make >& filename

0
投票

这通常不是您想要做的。您希望在支持读取编译器输出并转到有问题的文件/行字符的编辑器中运行编译。它适用于所有值得考虑的编辑器。这是 emacs 设置:

https://www.gnu.org/software/emacs/manual/html_node/emacs/Compilation.html


0
投票

以下命令将“make”命令的输出记录到文件“gnu_make.log”中

script gnu_make.log -c "make"

此文件可能包含 dos 格式的行终止字符,以消除可能使用以下命令。

dos2unix gnu_make.log

该文件还可能包含颜色转义序列,使用“cat”命令查看时效果很好,但如果想删除这些,可以使用以下命令完成

sed -i $'s/\e\\[[0-9;:]*[a-zA-Z]//g' gnu_make.log
© www.soinside.com 2019 - 2024. All rights reserved.