相关疑难解决方法(0)

bash:将stdout和stderr重定向(并追加)到文件和终端,并获得正确的退出状态

要将stdout和stderr重定向(并附加)到文件中,同时还在终端上显示它,我这样做:

command 2>&1 | tee -a file.txt
Run Code Online (Sandbox Code Playgroud)

但是,有没有其他方法可以做到这一点,以便我获得退出状态的准确值?

也就是说,如果我测试$?,我想看到退出状态command,而不是退出状态tee.

我知道我可以${PIPESTATUS[0]}在这里使用而不是$?,但我正在寻找另一种不需要检查的解决方案PIPESTATUS.

bash stdout stderr tee

35
推荐指数
2
解决办法
2万
查看次数

让gcc在调试信息中放置相对文件名

我正在编译的项目使用CMake,它喜欢绝对的路径名.

当我在启用调试信息的情况下进行编译时,gcc会将这些长名称放入.debug_str部分,这对于调试是不利的.我希望在那里有一个简短的相对项目根路径名.

是否有一些选项可以告诉gcc在发出调试数据之前去除路径名的某些部分?或者,也许,有一些工具可以在已编译的二进制文件上执行此操作?

我已经尝试使用SET(CMAKE_USE_RELATIVE_PATHS ON)(这似乎是令人难以接受的开发者)的选项,但我使用的乱源生成,路径名仍未形式我想他们是.即他们./../src/mod_foo/foo.c而不是mod_foo/foo.c.

debugging gcc cmake debug-symbols

14
推荐指数
2
解决办法
6009
查看次数

为什么CMake会忽略导出的CXX和CC环境变量?

我正在运行CMake(3.4.3),如CMake FAQ中所述:

export CC="cc_args.py $PWD/../bin/gcc"
export CXX="cc_args.py $PWD/../bin/g++"
cmake -DCMAKE_BUILD_TYPE=Debug ..
Run Code Online (Sandbox Code Playgroud)

然而,当我打印CMAKE_CXX_COMPILERCMAKE_C_COMPILER它仍然指向在系统默认的编译器/usr/bin.它只有在我明确读入这样的环境变量时才有效:

IF (NOT $ENV{CC} STREQUAL "")
  SET(CMAKE_C_COMPILER $ENV{CC})
ENDIF ()
IF (NOT $ENV{CXX} STREQUAL "")
  SET(CMAKE_CXX_COMPILER $ENV{CXX})
ENDIF ()
Run Code Online (Sandbox Code Playgroud)

但即使这样,建筑也会因此消息失败:

/bin/sh: 1: /home/peterg/bin/cc_args.py /home/peterg/Code/build/../bin/g++: not found
Run Code Online (Sandbox Code Playgroud)

但是我确信所有路径都是正确的,因为只执行两个冒号之间的路径按预期输出:

g++: fatal error: no input files
compilation terminated.
Run Code Online (Sandbox Code Playgroud)

更新:

似乎编译过程不喜欢编译器路径中的空格.我现在创建了两个脚本(一个用于GCC,一个用于CC),它们包装命令并传播参数,这似乎有效.但似乎我仍然在做一些根本性的错误,因为CMake本身也不会接受导出的变量CC=proxy_script_cc.shGCC=proxy_script_gcc.sh没有空格的变量.

cmake

7
推荐指数
1
解决办法
2万
查看次数

使CMake使用gccfilter

GCCFilter是一个简洁的perl脚本,可以为GCC的输出着色,从而使调试更有趣,更重要的是,更快.

您可以通过调用将GCCFilter与CMake生成的Makefile一起使用

gccfilter -a -c make
Run Code Online (Sandbox Code Playgroud)

但是,这种方法有一些缺点:CMake状态信息的延迟输出,CMake命令中没有颜色是最明显的.

问题:是否有写一些CMake的模块,搜索的方式gccfilter,如果编译器是gcc,如果检查,说COLOR_CXX是设置(相当容易了这里),然后告诉CMake的,以取代所有调用gccgccfilter -a -c gcc.

CMake提供变量CMAKE_CXX_COMPILER,但更改此变量将禁止CMake找到正确的包含路径等.是否有一些变量我们可能会project()在每次调用之前的前缀命令后更改gcc

gcc cmake gccfilter

3
推荐指数
1
解决办法
975
查看次数

CMake 我可以通过另一个程序过滤编译器输出

我可以告诉 CMake 通过外部程序通过管道传输来自编译器和/或链接器的所有 stderr 输出,并在终端上显示其输出吗?

cmake

3
推荐指数
1
解决办法
530
查看次数

在Bash脚本中处理gcc警告和输出

因此,我是整个Bash脚本编制领域的新手,但是我正在开发一个脚本,用于编译目录中的所有.c文件,并通过以下操作成功完成了该操作:

    for F in *.c; do
      gcc -c -Wall -o ${F%.c} $F
    done
Run Code Online (Sandbox Code Playgroud)

一切正常,但我希望输出看起来像:

ex1.c Errors
ex2.c OK
ex3.c Warnings
Run Code Online (Sandbox Code Playgroud)

因此,基本上我想对“ Ok”设置退出状态为0(一切正常),对“ Warnings”设置退出状态为1(警告,但没有错误),对“ Errors”设置退出状态2(未编译)。

我很难弄清楚该怎么做。我到处搜寻,找不到任何有用的资讯。我完全可以忽略一些东西。

编辑:无论如何都会说:如果gcc -Wall file.c有错误,则只说Error而不是完整的GCC错误处理消息?与警告相同并且可以完美编译吗?

c bash shell

2
推荐指数
1
解决办法
1522
查看次数

标签 统计

cmake ×4

bash ×2

gcc ×2

c ×1

debug-symbols ×1

debugging ×1

gccfilter ×1

shell ×1

stderr ×1

stdout ×1

tee ×1