如何将gcc 4.8设置为默认gcc编译器


27

我最近安装gcc 4.8使用brewOSX 10.7.5 (Lion)。我现在可以gcc 4.8使用

g++-4.8 some_file.c

或者使用默认gcc 4.2使用

g++ some_file.c

我想gcc 4.8用作默认编译器Xcode,如果我gcc在终端上键入。我想我必须更改其中的gcc-related链接dirname $(which gcc)

当我做

ls -al $(dirname $(which gcc)) | grep 'gcc\|g++\|c++'

我得到以下内容:

lrwxr-xr-x     1 root   wheel         7 Jul 31 12:17 c++ -> clang++
-rwxr-xr-x     1 root   wheel    909360 Nov 18  2011 c++filt
lrwxr-xr-x     1 root   wheel         5 Jul 31 12:17 clang++ -> clang
lrwxr-xr-x     1 root   wheel        12 Jul 31 12:17 g++ -> llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        12 Jul 31 12:17 gcc -> llvm-gcc-4.2
lrwxr-xr-x     1 root   wheel        28 Jul 31 12:17 gcov-4.2 -> ../llvm-gcc-4.2/bin/gcov-4.2
lrwxr-xr-x     1 root   wheel        52 Jul 31 12:17 i686-apple-darwin11-llvm-g++-4.2 -> ../llvm-gcc-4.2/bin/i686-apple-darwin11-llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        52 Jul 31 12:17 i686-apple-darwin11-llvm-gcc-4.2 -> ../llvm-gcc-4.2/bin/i686-apple-darwin11-llvm-gcc-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-cpp-4.2 -> ../llvm-gcc-4.2/bin/llvm-cpp-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-g++ -> ../llvm-gcc-4.2/bin/llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-g++-4.2 -> ../llvm-gcc-4.2/bin/llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-gcc -> ../llvm-gcc-4.2/bin/llvm-gcc-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-gcc-4.2 -> ../llvm-gcc-4.2/bin/llvm-gcc-4.2

当我跑步时:which gcc-4.8我得到了/usr/local/bin/gcc-4.8

完成此步骤的步骤将非常有帮助。

谢谢,麻烦您了。


1
有什么理由不使用高级llvm clang?
Max Ried

不具体。与香草gcc相比,llvm clang有什么好处?
奎因,

3
尽管速度更快,但它也提供了有意义的警告,但gcc真正缺少的一项真正宝贵的功能完全缺乏。
Max Ried

我懂了。是clang 3.3相当于gcc 4.8?我相信我也能brew install做到。
奎因,

首先要问的是重新铛为什么你不能使用在Xcode提供的,而不是铛GCC-4.8 -那么我们就可以回答clang3.3的将工作
user151019

Answers:


20

假设您正在使用bash(这是默认设置),则可以将/ usr / local / bin添加为PATH中的最高优先级,如下所示:

echo "PATH=\"/usr/local/bin:$PATH\"" >> ~/.bash_profile

这将确保在路径的所有其他区域之前检查/ usr / local / bin。然后,只需启动一个新的终端会话即可加载新变量。

另一种方法是:

  cd /usr/bin
  rm cc gcc c++ g++
  ln -s /usr/local/bin/gcc-4.8 cc
  ln -s /usr/local/bin/gcc-4.8 gcc
  ln -s /usr/local/bin/c++-4.8 c++
  ln -s /usr/local/bin/g++-4.8 g++

我的思考路径已经包含 usr/local/binecho $PATH显示:/ opt / local / bin:/ opt / local / sbin:/ opt / local / include:/ usr / local / mysql / bin:/ usr / bin / bjam:/ usr / bin:/ bin:/ usr / sbin:/ sbin:/ usr / local / bin:/ usr / X11 / bin:/ usr / local / go / bin:/ usr / texbin
quine

添加了另一个选项
Digitalchild 2013年

1
是的,它包含它,但是它在/ usr / bin之后,因此不会被首先读取。PATH是顺序的。
Digitalchild

1
这两种选择似乎都不适合我。我移到/usr/local/bin出现1st位置PATH-没作用- gcc仍然看电话gcc 4.2。然后我手动创建了符号链接,但是当我打开一个新的终端窗口时,g++或(cc|c++|gcc)都找不到。奇怪。感谢您的帮助
奎因,

3
我不建议在/usr/bin任何Unix(MacOS X是)中使用它……除非您是从事下一Unix版本new的新版本来源的专家。
2013年

19

感谢大家的帮助。我最终只是在~/.bash_profile如下创建别名:

alias gcc='gcc-4.8'
alias cc='gcc-4.8'
alias g++='g++-4.8'
alias c++='c++-4.8'

Lynken的答案非常有帮助,但我使用别名对其进行了修改,因为如果需要,我可以更轻松地撤消。

具体来说,如果PATH设置为/usr/local/bin(将brew链接到的位置gcc 4.8)出现在出现之前/usr/bingcc默认情况下,其中where 是链接的),则按照Lyken建议的方式创建链接在/usr/local/bin理论上应该对我有用。实际上,这并不是出于某种原因-出现链接器错误,别名便可以解决该错误,而我也无需解决该问题。

别名的另一个好处是,我不必链接我希望自制软件处理的链接,也不必与链接了gcc版本的工具竞争 /usr/local


您可能需要为将安装在其中的任何新二进制文件更改此设置/usr/local/bin。由于/usr/local/binPATH中的位置错误,您可能还安装了其他二进制文件并隐藏了它们。请再考虑一次我的答案,它一次,正确,永久地攻击了您的实际问题。
2013年

对。我之前曾向Lyken提到过,我已经改变PATH并提出了/usr/local/bin所有建议。我承认您的陈述是正确的,并且我需要更改PATH,但是(在我的情况下-即默认brew安装gcc 4.8),我gcc 4.8在调用时仍不会默认调用,gcc因为默认情况下两者之间没有符号链接。我必须像上面一样手动创建它。
奎因

我想说它的不同之处在于它是自己的答案,不过我会将您的答案标记为已解决。
Digitalchild

好的-感谢Lyken。只要系统允许,我就会这样做。
奎因

1
我也尝试过别名,但是仅当您gcc直接从终端运行时,它才能正常工作。如果您使用的是makefile,clang仍在使用,则仅在使用仅在中可用的编译器选项时才发现此问题gcc
Tien Do

11

我使用gcc-4.8:

export CC=/usr/local/bin/gcc

export CXX=/usr/local/bin/g++

export CPP=/usr/local/bin/cpp

export LD=/usr/local/bin/gcc

alias c++=/usr/local/bin/c++

alias g++=/usr/local/bin/g++

alias gcc=/usr/local/bin/gcc

alias cpp=/usr/local/bin/cpp

alias ld=/usr/local/bin/gcc

alias cc=/usr/local/bin/gcc

回到苹果gcc:

export CC=/usr/bin/gcc

export CXX=/usr/bin/g++

export CPP=/usr/bin/cpp

export LD=/usr/bin/ld

alias c++=/usr/bin/c++

alias g++=/usr/bin/g++

alias gcc=/usr/bin/gcc

alias cpp=/usr/bin/cpp

alias cc=/usr/bin/gcc

alias ld=/usr/bin/ld

或将其放入文件中,然后: source <file>


1

假设您实际的shell初始化是通过进行的~/.profile,那么您将必须对其进行修改,以使其/usr/local/bin位于其他gcc所有PATH组件及其所有关联二进制文件所在的位置。

这是执行此干净修改的方法:

光盘

_shell_init =`egrep'(^ |)PATH'.profile 2> / dev / null`

如果[“ $ {_ shell_init}” =“”]; 然后
    #路径未在.profile中定义
    #在此安装PATH的第一个相对定义
    回声'PATH = / usr / local / bin:$ {PATH}
导出路径'>>。profile
    。。轮廓
    exec $ {SHELL}
其他
    #删除/ usr / local / bin中所有可能出现的位置
    #设置到PATH中,然后将其插入所有其他组件的前面
    sed -E -e'/(^ |)PATH = / s,:/ usr / local / bin,'\
        -e'/(^ |)PATH = / s,/ usr / local / bin:,,'\
        -e'/(^ |)PATH = / s ,,&/ usr / local / bin :,'.profile> .profile.new
    mv .profile.new .profile
    。。轮廓
    exec $ {SHELL}
科幻

注意:如果您~/.profile已经结构化,则必须手动调整此Shell脚本以在正确的位置适应正确的PATH定义。


这无疑是修改的完美选择PATH因此/usr/local/bin首先可以看到。将来这可能使我免于头痛。希望我可以为您+1。我的问题是,gcc它仍然链接到,gcc 4.2而不是gcc 4.8因为gcc -> gcc-4.8in中没有符号链接/usr/local/bin。我仍然需要或者别名gccgcc-4.8~/.profile或符号链接(ln -s gcc-4.8 gcc)在/usr/local/bin更新后PATH您的脚本。是吗
奎因

我很惊讶brew没有添加正确的符号链接。您是否在同一主题上阅读了此答案:apple.stackexchange.com/a/38247/22003
2013年

0

假定制作别名或链接到不同的gcc二进制文件会使它们在默认系统包含文件夹之前使用其自己的包含。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.