2013-06-29 30 views
0

我正在研究一个需要GCC 4.7或更高版本的C++项目。当我在终端的命令行中调用make时,它工作正常,但在Emacs中运行M-x compile时失败。Emacs shell与GCC终端有不同的行为

当我运行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使用与终端相同版本的GCC?

+1

这是通常的macosx问题,您的shell的环境没有在从dock(例如Emacs)启动的应用程序中设置。 – Stefan

+0

@Stefan你知道如何解决这个问题吗? –

回答

2

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。但总体思路是一样的:把emacs shell启动命令放在.bash_WHATEVER文件中。

0

无论你在终端或通过的Mx推出GCC编译,GCC可执行文件的位置被PATH环境变量(确定,除非在Makefile中配置的 - 但如果它的话,你不会有你描述的问题)。所以,首先检查它在终端:

echo $PATH 

使用

which gcc 

然后,在Emacs你可以仔细检查可执行文件的位置,

(getenv "PATH") 

也就是说当emacs通过Mx编译将会看到什么make。使用setenv将值更改为您在终端中获得的值。您也可以将emacs自己的变量exec-path更改为与您的PATH同步。该变量是字符串列表(=路径),使用add-to-list添加路径。