Ubuntu'da varsayılan GCC derleyicisini nasıl değiştirebilirim?


98

Gcc / g ++ - 4.4'e sahip olan ubuntu 11.04 üzerinde gcc-3.3 / g ++ - 3.3'ü kurdum. Yani benim sistemimde hem gcc-3.3 hem de 4.4 mevcut. Her iki derleyiciyi de istediğim gibi arayabiliyorum. Eğer sadece komutu çağırırsam gccgcc-4.4 çağrılacaktır. Gcc-3.3'ü çağırmak için şu komutu kullanmalıyım gcc-3.3.

Varsayılan derleyiciyi gcc-3.3 olarak nasıl değiştirebilirim? Komutu çalıştırdığımda, gccgcc-4.4'ü değil gcc-3.3'ü çağırmalı.

Ayrıca, bir make dosyasındaki CXX değişkenini gcc-3.3 olarak nasıl değiştirebilirim? Tüm marka dosyalarını değiştirmek yerine sistemdeki tek bir genel yeri değiştirmek istiyorum.


2
Cxx bayrağı için, çağırabilirsiniz CXX=gcc-3.3veya export CXX=gcc-3.3sonra makeancak birlikte global olarak bunu değişince update-alternativeszaten gcc-3.3 kullanacak ve bu gerekli değildir.
DipSwitch

1
@RoboAlex: CXX ortam değişkeni isteğinizi dikkate almak için cevabımı tekrar güncelledi. Ancak, bunun yalnızca güncelleme alternatiflerini daha sonra değiştirmeniz durumunda hizmet vereceğini lütfen unutmayın.
jopasserat

Sadece PATH'inizi değiştirmeniz gerekir. Cevapların çoğu alternatifler sisteminden bahsediyor, ancak hem Debian hem de LLVM geliştiricileri, alternatifler sisteminin sürüm oluşturma için DEĞİL, alternatifler için kullanılması gerektiği konusunda hemfikir . Cevabımda daha fazla açıklandı.
hmijail resignees

Yanıtlar:


114

@Tommy'nin önerdiği gibi kullanmalısınız update-alternatives.
Bir ailenin her yazılımına değerler atar, böylece uygulamaların çağrılacağı sırayı tanımlar.

Aynı yazılımın farklı sürümlerini bir sistem üzerinde tutmak için kullanılır. Sizin durumunuzda, birkaç sapma kullanabileceksiniz gccve biri tercih edilecektir.

Gcc'nin mevcut önceliklerini anlamak için, @ tripleee'nin yorumunda belirtilen komutu yazın:

update-alternatives --query gcc

Şimdi, atfedilen önceliğe dikkat edin gcc-4.4çünkü daha yüksek bir tane vermeniz gerekecek gcc-3.3.
Alternatiflerinizi ayarlamak için şuna benzer bir şeye sahip olmalısınız ( gcckurulumunuzun konumunda olduğu /usr/bin/gcc-3.3ve gcc-4.4önceliğinin 50'den az olduğu varsayılarak ) :

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-3.3 50

--Düzenle--

Son olarak, update-alternativessürümler arasında kolayca geçiş yapmak için interaktif arayüzünü de kullanabilirsiniz . Tip update-alternatives --config gccyüklü olanlar arasında kullanmak istediğiniz gcc sürümü seçmeniz istenir için.

--düzenle 2 -

Şimdi, CXX ortam değişkenini sistem çapında düzeltmek için, .bashrcdosyanıza @ DipSwitch's ile gösterilen satırı eklemeniz gerekir (bu, değişikliği yalnızca kullanıcınız için uygulayacaktır, bu benim görüşüme göre daha güvenli):

echo 'export CXX=/usr/bin/gcc-3.3' >> ~/.bashrc

1
@thang ayrıca şu aradı cc:root@host:/root# update-alternatives --get-selections | grep '/usr/bin/gcc' cc auto /usr/bin/gcc
jopasserat

'Update-alternatives --config gcc'
komutunu çalıştırdığımda

bunu otomatik olarak nasıl yapabildin? bu, çıktısını kontrol etmek için manuel bir adım gerektirir ve bu, update-alternatives --query gccörneğin otomatik bir sağlama komut dosyasında çalışmayabilir. Ayrıca, bu nasıl platformdan bağımsız hale getirilebilir?
ely

70

İşte jHackTheRipper'ın TL; DR kalabalığı için cevabının eksiksiz bir örneği. :-) Bu durumda, g ++ - 4.5'i varsayılan 4.6 olan bir Ubuntu sisteminde çalıştırmak istedim. As root:

apt-get install g++-4.5
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 100
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.5 50
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 100
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.5 50
update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.6 100
update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.5 50
update-alternatives --set g++ /usr/bin/g++-4.5
update-alternatives --set gcc /usr/bin/gcc-4.5
update-alternatives --set cpp-bin /usr/bin/cpp-4.5

Burada 4.6 hala varsayılandır (aka "otomatik mod"), ancak açık bir şekilde geçici olarak 4.5'e geçiyorum (manuel mod). 4.6'ya geri dönmek için:

update-alternatives --auto g++
update-alternatives --auto gcc
update-alternatives --auto cpp-bin

( cpp-binYalnızca cpp. Ubuntu'nun cppana bağlantısına sahip bir alternatifi zaten vardır /lib/cpp. Bu bağlantıyı yeniden adlandırmak bağlantıyı kaldırır ve /lib/cppbu da komut dosyalarını bozabilir.)


8
Yüklü g ++ - 5 derleyicisini varsayılan olarak ayarlamaya çalışan geleceğin tembel insanı için:sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100
imallett

Geriye sadece 1 soru kaldı: APT, g++-6paketi kurarken bunu neden yapmıyor ?
rustyx

Varsayılan derleyiciyi bu şekilde g ++ - 5'e değiştirdim, ancak yine de g ++ - 7 standart kitaplıklarını kullanıyor ve şimdi tanımsız __builtinşeylerle ilgili hatalar alıyorum .
Youda008

23

Bu, ana ve bağımlı (gcc ve g ++) alternatiflerinin nasıl oluşturulacağı ve yönetileceği konusunda harika bir açıklama ve adım adım talimattır.

Kısaca:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7
sudo update-alternatives --config gcc

40 ve 60 ile ne var. gcc-6 kullanmaya çalışıyorum.
nyxee

@nyxee 40 ve 60, her bir girişe atanan önceliği belirtir, konuyla ilgili daha fazla eksiksizlik için diğer yanıtları kontrol edin
jopasserat

10

Tümüyle 4.8 ile 6 arasında --slaves:

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 \
                    10 \
                    --slave   /usr/bin/cc cc /usr/bin/gcc-4.8 \
                    --slave   /usr/bin/c++ c++ /usr/bin/g++-4.8 \
                    --slave   /usr/bin/g++ g++ /usr/bin/g++-4.8 \
                    --slave   /usr/bin/gcov gcov /usr/bin/gcov-4.8 \
                    --slave   /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-4.8 \
                    --slave   /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-4.8 \
                    --slave   /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.8 \
                    --slave   /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.8 \
                    --slave   /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.8

ve

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 \
                    15 \
                    --slave   /usr/bin/cc cc /usr/bin/gcc-6 \
                    --slave   /usr/bin/c++ c++ /usr/bin/g++-6 \
                    --slave   /usr/bin/g++ g++ /usr/bin/g++-6 \
                    --slave   /usr/bin/gcov gcov /usr/bin/gcov-6 \
                    --slave   /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-6 \
                    --slave   /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-6 \
                    --slave   /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-6 \
                    --slave   /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-6 \
                    --slave   /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-6

İle aralarında değiştirin update-alternatives --config gcc.


2
kaldırıldıktan sonra düzgün çalışıyor ccve c++hataya neden oluyor: alternatif cc
gcc'nin

7

Şimdi, Ubuntu / kesin için gcc-4.9 var.

Dağıtım derleyicisinin daha yüksek önceliğe sahip olduğu bir grup derleyici alternatifi oluşturun:

root$ VER=4.6 ; PRIO=60
root$ update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
root$ update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-$VER $PRIO

root$ VER=4.9 ; PRIO=40
root$ update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
root$ update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-$VER $PRIO

NOT: g ++ sürümü, bir gcc sürüm anahtarı ile otomatik olarak değiştirilir. Bir "cpp" ana alternatifi olduğundan cpp-bin ayrı ayrı yapılmalıdır.

Kullanılabilir derleyici alternatiflerini listeleyin:

root$ update-alternatives --list gcc
root$ update-alternatives --list cpp-bin

Gcc, g ++ ve cpp'nin 4.9 sürümünü manuel olarak seçmek için şunları yapın:

root$ update-alternatives --config gcc
root$ update-alternatives --config cpp-bin

Derleyici sürümlerini kontrol edin:

root$ for i in gcc g++ cpp ; do $i --version ; done

Dağıtım derleyici ayarlarını geri yükleyin (burada: v4.6'ya dönün):

root$ update-alternatives --auto gcc
root$ update-alternatives --auto cpp-bin

3

Yeni bir clang derleyicisi kurmaya çalışırken bu sorunu buldum. Hem Debian hem de LLVM bakımcılarının , alternatifler sisteminin sürüm oluşturma için DEĞİL alternatifler için kullanılması gerektiği konusunda hemfikir oldukları ortaya çıktı .


PATH=/usr/lib/llvm-3.7/bin:$PATH
Önerdikleri çözüm şuna benzer: burada /usr/lib/llvm-3.7/bin, llvm-3.7 paketi tarafından oluşturulan ve son eksiz adlarıyla tüm araçları içeren bir dizindir. Bununla, llvm-config (sürüm 3.7), PATH'inizde düz adıyla görünür. Sembolik bağlantılarla uğraşmaya veya / usr / bin içine yüklenmiş llvm-config-3.7'yi çağırmaya gerek yok.

Ayrıca, llvm-defaults (veya gcc-defaults) adında bir paket olup olmadığını kontrol edin; bu, bunu yapmanın başka bir yolunu sunabilir (ben kullanmadım).


Mükemmel çözüm! Özel oluşturulmuş "gcc" süitleri arasından seçim yapmak için kullanıyorum
Mad Calm

1

Kişisel bir amaç için daha hızlı (ama yine de çok temiz) bir yol istiyorsanız (örneğin, derleyicinin sürümüyle ilgili bazı güçlü gereksinimleri olan belirli bir proje oluşturmak istiyorsanız), aşağıdaki adımları izleyin:

  • çok yüksek önceliğe sahip kişisel bir dizin yazın echo $PATHve arayın (benim durumumda var );~/.local/bin
  • sembolik bağları bu dizine ekleyin:

Örneğin:

ln -s /usr/bin/gcc-WHATEVER ~/.local/bin/gcc
ln -s /usr/bin/g++-WHATEVER ~/.local/bin/g++

Tabii ki, bu tek bir kullanıcı için işe yarayacak (sistem çapında bir çözüm değil), ancak diğer yandan kurulumumda çok fazla şeyi değiştirmeyi sevmiyorum.


Yani kendi anlık, sisteme paralel alternatifler sisteminizi oluşturuyorsunuz. Neden gerçek olanı kullanmıyorsunuz?
hmijail mourns resignees

@hmijail Açıkladığım gibi, tüm kurulumumu bozmadan çok tek bir proje oluşturmak istediğimde bu yolu kullanıyorum. Çok iyi çalışıyor ve sonra kolayca çıkarabilirim.
Thomas Baruchel

1
Sadece PATH'inizi değiştirmek daha hızlı, daha temiz olur ve gcc ile ilgili araçlarınızın birbiriyle senkronize olmasını sağlar.
hmijail, resignees

0

Sadece aşağıdaki satırları kullandım ve işe yaradı. Sadece derlemek istedik VirtualBoxve VMWare WorkStationkullanma kernel 4.8.10ile ilgili Ubuntu 14.04. Başlangıçta çoğu şey, örneğin grafikler ve ağlar gibi çalışmıyordu. VMWare workstationTalep ettiğim için şanslıydım gcc 6.2.0. Benim başlayamadı Genymotion Android emulatorsçünkü virtualbox aşağı oldu. Gerekirse sonuçları daha sonra yayınlayacak.

VER=4.6 ; PRIO=60
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
VER=6 ; PRIO=50
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
VER=4.8 ; PRIO=40
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.