Emacsshell与带有GCC的Terminal有不同的行为
Emacs shell has different behavior from Terminal with GCC
我正在处理一个需要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
向其添加路径。
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 奇怪的结构&GCC&clang(void*返回类型)
- GCC本机矩阵运算库
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- gcc和c++17的过载解析失败
- 数据成员SFINAE的C++17测试:gcc vs clang
- GCC对可能有效的代码抛出init list生存期警告
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 使用gcc从静态链接的文件中查找可选符号
- 普通环路未使用gcc 4.8.5自动矢量化
- 有了gcc,是否可以链接库,但前提是它存在
- 在clang++预处理器中确定gcc工具链版本
- 为什么 gcc 编译这个而 msvc 没有
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 如何使用Clang/GCC在Mac上为C/C++设置VSCode
- Emacsshell与带有GCC的Terminal有不同的行为