试图结合ccache和colorgcc.以下链接文字:
运行g ++ --version时接收:
Can't exec "ccache /usr/bin/gcc": No such file or directory at /usr/lib/perl5/5.8.8/IPC/Open3.pm line 246.
open3: exec of ccache /usr/bin/gcc --version failed at /usr/local/bin/colorgcc/gcc line 208
Run Code Online (Sandbox Code Playgroud)
任何想法如何解决?
Mal*_*ous 22
刚刚遇到同样的问题.对我来说,可以通过仔细设置环境变量来解决问题:
# Make "g++" command call colorgcc
export PATH="/usr/lib/colorgcc/bin:$PATH"
# Tell ccache to invoke compilers in /usr/bin
export CCACHE_PATH="/usr/bin"
Run Code Online (Sandbox Code Playgroud)
然后,我所要做的就是编辑colorgcc的配置文件(/etc/colorgcc/colorgcc或~/.colorgcc)并告诉它调用ccache:
g++: /usr/lib/ccache/bin/g++
gcc: /usr/lib/ccache/bin/gcc
c++: /usr/lib/ccache/bin/g++
cc: /usr/lib/ccache/bin/gcc
g77: /usr/lib/ccache/bin/g77
f77: /usr/lib/ccache/bin/g77
gcj: /usr/lib/ccache/bin/gcj
Run Code Online (Sandbox Code Playgroud)
这当然只有在你安装了colorgcc的符号链接/usr/lib/colorgcc/bin和ccache的符号链接时才有效/usr/lib/ccache/bin- 相应地调整.
Tri*_*ley 17
如果不打补丁colorgcc.pl本身,解决这一问题最简单的方法是自己写一个简单的包装脚本为每个命令,要求ccache与该命令相应参数,并沿着接到剧本的参数传递(有效讨好调用ccache.)
例如,对于gcc:
/usr/local/bin/ccache-gcc.sh:
#!/bin/bash
ccache /usr/bin/gcc "$@"
Run Code Online (Sandbox Code Playgroud)〜/ .colorgcc:
gcc: /usr/local/bin/ccache-gcc.sh
Run Code Online (Sandbox Code Playgroud)对于g ++:
/usr/local/bin/ccache-g++.sh:
#!/bin/bash
ccache /usr/bin/g++ "$@"
Run Code Online (Sandbox Code Playgroud)〜/ .colorgcc:
gcc: /usr/local/bin/ccache-g++.sh
Run Code Online (Sandbox Code Playgroud)有一些方法可以清理它,以便你只使用一个脚本,每个变体都有符号链接,但这些超出了这个答案的范围,我把它们作为一个练习留给你:-)
问题是脚本将prefs文件中冒号右侧的所有内容视为传递给exec的"命令",而不是"命令"和额外的"参数".即,在您的情况下,脚本最终尝试执行此操作:
不正确:
exec "ccache /usr/bin/g++" "--version"
Run Code Online (Sandbox Code Playgroud)
(即" ccache/usr/bin/g ++ "是一个参数.)
但它应该这样做:
正确:
exec "ccache" "/usr/bin/g++" "--version"
Run Code Online (Sandbox Code Playgroud)
(即" ccache "和" / usr/bin/g ++ "是两个独立的参数.)
在可能对其论点应用一些"我的意思"逻辑之后,Perl exec最终调用execvp了它.execvp然后做一些自己的DWIM.Perl的exec预处理将单个参数字符串拆分为多个参数execvp期望,只有在exec收到单个参数时才会启动.在colorgcc.pl,调用exec看起来像这样(粗略地):
exec "${program}" @ARGV
Run Code Online (Sandbox Code Playgroud)
其中,${program}来自于你的配置(或默认),并且@ARGV是你(间接)调用,当你传递的参数列表colorgcc.pl.在你的情况,${program}是,从字面上看,ccache /usr/bin/g++(一个字符串,如上面提到的)时,它应该只是ccache,与/usr/bin/g++被前置到@ARGV.
(你们当中有些人可能想知道为什么我会解释这个问题,当它是一个单行修复时colorgcc.pl.这是真的,但如果我这样做,世界将失去另一个机会来了解这类错误.另外,我不会得到那么多的选票.)