Emacsshell与带有GCC的Terminal有不同的行为

Emacs shell has different behavior from Terminal with GCC

本文关键字:Terminal GCC Emacsshell      更新时间:2023-10-16

我正在处理一个需要GCC 4.7或更高版本的C++项目。当我在Terminal中的命令行上调用make时,它工作得很好,但当我在Emacs中运行M-x compile时,它失败了。

当我在命令行上运行gcc --version时,它显示

gcc (MacPorts gcc47 4.7.3_0+universal) 4.7.3

但当我在Emacs中从shell运行gcc --version时,它显示

i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)

我做了更多的调查,发现了Emacs和Terminal之间的另一个区别。我在终端上使用MacPorts安装了GCC 4.7;但当我在Emacs中运行port install foo时,它显示port: command not found

为什么会发生这种情况,我如何让Emacs使用与Terminal相同版本的GCC?

M-x shell启动一个新的shell。对我来说,它是一个bash shell,但也可以是csh、zsh或其他shell。当emacs启动一个新的shell时,它会运行~/.emacs_shell,其中shell是bash或csh之类的。因此,您可以将您的shell启动文件复制到该文件中,它有望正确设置您的路径和其他环境变量。

在我的例子中,我是一个bash用户,所以我通过.profile将其复制到.emacs_bash中,并成功了。您可能有一个.bash_profile或.bashrc而不是.profile。但总体思路是一样的:将emacsshell启动命令放在.bash_WHATEVER文件中。

无论您是在Terminal中还是通过M-xcompile启动gcc,gcc可执行文件的位置都由PATH环境变量决定(除非在Makefile中进行了配置,但如果是这样,您就不会遇到所描述的问题)。因此,首先在终端中检查:

echo $PATH

您可以使用仔细检查可执行文件的位置

which gcc

然后,在emacs中,

(getenv "PATH")

当emacs通过M-x编译启动它时,make就会看到这一点。使用setenv将该值更改为您在终端中获得的值。您还可以更改emacs自己的变量exec-path,使其与您的PATH同步。该变量是一个字符串列表(=路径),使用add-to-list向其添加路径。