Comment définir gcc 4.8 comme compilateur gcc par défaut

27

J'ai récemment installé à l' gcc 4.8aide brewsur OSX 10.7.5 (Lion). Je peux maintenant compiler en utilisant gcc 4.8en utilisant

g++-4.8 some_file.c

ou en utilisant la valeur gcc 4.2par défaut en utilisant

g++ some_file.c

Je veux utiliser gcc 4.8comme compilateur par défaut pour Xcodeet si je tape gccsur le terminal. Je suppose que je dois modifier les gcc-relatedliens à l'intérieur dirname $(which gcc).

Quand je fais

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

J'obtiens ce qui suit:

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

Quand je cours: which gcc-4.8je reçois /usr/local/bin/gcc-4.8.

Les étapes pour y parvenir seraient très utiles.

S'il te plaît et merci.

quine
la source
1
Y a-t-il une raison pour ne pas utiliser le clang llvm supérieur?
Max Ried
Pas spécifiquement. Quel est l'avantage de llvm clang par rapport à vanilla gcc?
quine
3
Tout en étant plus rapide, il offre également des avertissements significatifs, une fonctionnalité vraiment précieuse qui manque complètement à gcc.
Max Ried
Je vois. Est clang 3.3l'équivalent de gcc 4.8? Je crois que je le peux brew installaussi.
quine
La première question à poser est re clang pourquoi ne pouvez-vous pas utiliser le clang fourni avec Xcode plutôt que gcc-4.8 - alors nous pourrions répondre que clang3.3 fonctionnerait
user151019

Réponses:

20

En supposant que vous utilisez bash (c'est la valeur par défaut), vous pouvez ajouter / usr / local / bin comme priorité absolue dans PATH comme ceci:

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

Cela garantira que / usr / local / bin est vérifié avant toutes les autres zones de votre chemin. Il suffit ensuite de démarrer une nouvelle session de terminal pour charger la nouvelle variable.

Une autre façon de procéder:

  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++
Digitalchild
la source
Mon chemin de réflexion contient déjà usr/local/bin. echo $PATHrévèle: / 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
Ajout d'une autre option
Digitalchild
1
Oui, il le contient, mais il se trouve après / usr / bin, il n'est donc pas lu en premier. PATH est séquentiel.
Digitalchild
1
Les deux options semblent ne pas fonctionner pour moi. Je me suis déplacé /usr/local/binpour apparaître en premier dans PATH- ce qui n'a eu aucun effet - appeler gccregarde toujours. gcc 4.2J'ai ensuite créé manuellement les liens symboliques, mais lorsque j'ouvre une nouvelle fenêtre de terminal et g++ou ( cc|c++|gcc), tous ne sont pas trouvés. Étrange. Merci pour votre aide
quine
3
Je ne conseillerais pas de jouer dans /usr/binn'importe quel Unix (qui est MacOS X)… à moins que vous ne soyez un spécialiste travaillant sur les sources d'une nouvelle version de la prochaine version Unix ☺.
dan
19

Merci à tous pour votre aide. J'ai fini par créer des alias ~/.bash_profilecomme suit:

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

La réponse de Lynken est très utile, mais je l'ai adaptée avec des alias car c'est plus facile pour moi de l'annuler si nécessaire.

Plus précisément, si PATHest défini de telle sorte que /usr/local/bin(où brew place le lien gcc 4.8) apparaisse avant apparaisse /usr/bin(où gccest lié par défaut), la création de liens comme Lyken l'a suggéré /usr/local/bindevrait théoriquement fonctionner pour moi. En pratique, ce n'est pas le cas pour une raison quelconque - échouer avec une erreur de l'éditeur de liens et les alias contourner cette erreur sans que je doive également résoudre ce problème.

L'autre avantage des alias est que je n'ai pas à lier ce que je veux que l'homebrew gère et que je ne doive pas rivaliser avec cet outil pour lequel la version de gcc est liée /usr/local

quine
la source
Vous devrez peut-être modifier cela pour tout nouveau binaire que vous installerez /usr/local/bin. Vous pouvez également avoir d'autres binaires installés et masqués en raison du mauvais positionnement de /usr/local/binvotre PATH. Veuillez considérer une fois de plus ma réponse, elle attaque votre vrai problème une fois, correctement et pour toujours.
dan
Droite. J'ai mentionné plus tôt à Lyken que j'avais modifié PATHet mis /usr/local/binavant tout. Je concède que votre déclaration est correcte et que je devais la modifier PATH, mais (dans mon cas - c'est-à-dire l' brewinstallation par défaut de gcc 4.8) je n'appellerai toujours pas gcc 4.8par défaut lorsque j'appellerai gcccar il n'y a pas de lien symbolique entre les deux par défaut. J'ai dû le créer manuellement comme je l'ai fait ci-dessus.
quine
Je dirais que c'est assez différent pour être sa propre réponse, je marquerais votre réponse comme résolue cependant.
Digitalchild
Ok - merci Lyken. Je le ferai dès que le système me le permettra.
quine
1
J'ai également essayé l'alias, mais cela ne fonctionne correctement que si vous exécutez gccdirectement à partir du terminal. Si vous utilisez un makefile, clangest toujours utilisé, je n'ai trouvé ce problème que lorsque vous utilisez une option de compilation qui n'est disponible que dans gcc.
Tien Do
11

J'utilise pour 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

et retour à apple 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

ou le mettre dans un fichier puis: source <file>

ydk2
la source
1

Supposons que votre véritable initialisation du shell soit terminée ~/.profile, vous devrez alors la modifier de manière à placer en /usr/local/binavant de tout autre composant PATH où se trouvent gcctous les binaires associés.

Voici la façon d'effectuer cette modification propre:

CD

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

if ["$ {_ shell_init}" = ""]; puis
    # PATH n'est pas défini dans .profile
    # installe là la première définition relative de PATH
    echo 'PATH = / usr / local / bin: $ {PATH}
export PATH '>>. profile
    . .profil
    exec $ {SHELL}
autre
    # supprime toutes les occurrences de / usr / local / bin où qu'elles se trouvent
    # défini dans PATH, et insérez-le avant tous les autres composants
    sed -E -e '/ (^ |) CHEMIN = / s,: / usr / local / bin ,,' \
        -e '/ (^ |) CHEMIN = / s, / usr / local / bin: ,,' \
        -e '/ (^ |) PATH = / s ,, & / usr / local / bin :,' .profile> .profile.new
    mv .profile.new .profile
    . .profil
    exec $ {SHELL}
Fi

Attention: si votre ~/.profileest déjà structuré, ce script shell devra être réglé manuellement pour correspondre à la bonne définition de PATH au bon endroit.

dan
la source
C'est certainement parfait pour la modification de PATHsorte que cela /usr/local/binse voit en premier. Cela me sauvera probablement des maux de tête à l'avenir. J'aimerais pouvoir vous attribuer +1. Mon problème est que gccc'est toujours lié à gcc 4.2et non gcc 4.8parce qu'il n'y a pas de lien symbolique pour gcc -> gcc-4.8dans /usr/local/bin. J'aurais encore besoin d'alias gcccomme gcc-4.8dans ~/.profileou symlink ( ln -s gcc-4.8 gcc) /usr/local/binaprès la mise PATHà jour avec votre script. Vous?
quine
Je suis surpris de brewne pas avoir ajouté les bons liens symboliques. Avez-vous lu cette réponse sur le même sujet: apple.stackexchange.com/a/38247/22003 ?
dan
0

Il est supposé que la création d'alias ou la liaison à différents binaires gcc leur fera utiliser leur propre inclusion avant le dossier d'inclusion système par défaut.

Dragonborn
la source