Bagaimana cara mengubah compiler GCC default di Ubuntu?


95

Saya telah menginstal gcc-3.3 / g ++ - 3.3 di ubuntu 11.04 yang sudah memiliki gcc / g ++ - 4.4. Jadi di sistem saya, gcc-3.3 dan 4.4 tersedia. Saya dapat memanggil kedua kompiler sesuai keinginan saya. Jika saya hanya memanggil perintah gccmaka gcc-4.4 akan dipanggil. Untuk memanggil gcc-3.3, saya harus menggunakan perintah gcc-3.3.

Bagaimana cara mengubah kompilator default sebagai gcc-3.3? Ketika saya menjalankan perintah gccitu harus memanggil gcc-3.3 dan bukan gcc-4.4.

Selain itu, bagaimana cara mengubah variabel CXX di file make ke gcc-3.3? Saya ingin mengubah satu tempat global umum dalam sistem daripada mengubah semua file make.


2
Untuk flag CXX Anda dapat memanggil CXX=gcc-3.3atau export CXX=gcc-3.3dan kemudian makeketika Anda mengubahnya secara global update-alternativesdengannya sudah akan menggunakan gcc-3.3 dan ini tidak perlu.
DipSwitch

1
@RoboAlex: memperbarui jawaban saya lagi untuk memperhitungkan permintaan variabel lingkungan CXX Anda. Namun, harap dicatat bahwa ini hanya akan berfungsi jika Anda mengubah alternatif pembaruan nanti.
jopasserat

Anda hanya perlu mengubah PATH Anda. Sebagian besar jawaban menyebutkan sistem alternatif, tetapi baik Debian dan pengelola LLVM setuju bahwa sistem alternatif harus digunakan sebagai alternatif , BUKAN untuk pembuatan versi . Lebih lanjut dijelaskan dalam jawaban saya.
hmijail berduka atas orang yang mengundurkan diri

Jawaban:


112

Seperti yang disarankan @Tommy, Anda harus menggunakan update-alternatives.
Ini memberikan nilai ke setiap perangkat lunak keluarga, sehingga itu menentukan urutan aplikasi akan dipanggil.

Ini digunakan untuk mempertahankan versi yang berbeda dari perangkat lunak yang sama pada suatu sistem. Dalam kasus Anda, Anda akan dapat menggunakan beberapa deklinasi gcc, dan satu akan disukai.

Untuk mengetahui prioritas gcc saat ini, ketik perintah yang ditunjukkan oleh komentar @ tripleee:

update-alternatives --query gcc

Sekarang, perhatikan prioritas yang dikaitkan gcc-4.4karena Anda harus memberikan prioritas yang lebih tinggi gcc-3.3.
Untuk mengatur alternatif Anda, Anda harus memiliki sesuatu seperti ini (dengan asumsi gccinstalasi Anda terletak di /usr/bin/gcc-3.3, dan gcc-4.4prioritasnya kurang dari 50) :

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

--edit--

Terakhir, Anda juga dapat menggunakan antarmuka interaktif update-alternativesuntuk beralih antar versi dengan mudah. Ketik update-alternatives --config gccuntuk diminta memilih versi gcc yang ingin Anda gunakan di antara yang diinstal.

--edit 2 -

Sekarang, untuk memperbaiki variabel lingkungan CXX di seluruh sistem, Anda perlu meletakkan baris yang ditunjukkan oleh @ DipSwitch di .bashrcfile Anda (ini akan menerapkan perubahan hanya untuk pengguna Anda, yang menurut saya lebih aman):

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

1
@thang juga disebut cc:root@host:/root# update-alternatives --get-selections | grep '/usr/bin/gcc' cc auto /usr/bin/gcc
jopasserat

Ketika saya menjalankan 'update-alternate --config gcc', tidak terjadi apa-apa, meskipun saya memiliki gcc dan anaconda sistem
Kelthar

bagaimana Anda bisa melakukan ini secara otomatis? ini memerlukan langkah manual untuk memeriksa keluaran update-alternatives --query gcc, yang mungkin tidak berfungsi, misalnya dalam skrip penyediaan otomatis. Juga, bagaimana ini bisa dibuat platform agnostik?
ely

68

Berikut adalah contoh lengkap jawaban jHackTheRipper untuk TL; DR kerumunan. :-) Dalam kasus ini, saya ingin menjalankan g ++ - 4.5 pada sistem Ubuntu yang defaultnya adalah 4.6. Seperti 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

Di sini, 4.6 masih default (alias "mode otomatis"), tetapi saya secara eksplisit beralih ke 4.5 untuk sementara (mode manual). Untuk kembali ke 4.6:

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

(Perhatikan penggunaan cpp-binalih - alih hanya cpp. Ubuntu sudah memiliki cppalternatif dengan tautan master /lib/cpp. Mengganti nama tautan itu akan menghapus /lib/cpptautan, yang dapat merusak skrip.)


8
Untuk orang yang malas di masa mendatang mencoba menyetel g ++ - 5 compiler yang diinstal menjadi default:sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100
imallett

Hanya tersisa 1 pertanyaan: mengapa APT tidak melakukan ini saat menginstal g++-6paket?
rustyx

Saya mengganti kompiler default ke g ++ - 5 dengan cara ini, tetapi masih menggunakan pustaka standar g ++ - 7, dan sekarang saya mendapatkan kesalahan dengan __builtinhal-hal yang tidak ditentukan .
Youda008

22

Ini adalah deskripsi bagus dan petunjuk langkah demi langkah cara membuat dan mengelola alternatif master dan slave (gcc dan g ++).

Singkatnya:

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

ada apa dengan 40 dan 60. Saya mencoba menggunakan gcc-6.
nyxee

@nyxee 40 dan 60 menunjukkan prioritas yang ditetapkan untuk setiap entri, periksa jawaban lain untuk kelengkapan lebih lanjut tentang topik
jopasserat

10

Antara 4,8 dan 6 dengan semua --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

dan

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

Ganti di antara keduanya dengan update-alternatives --config gcc.


2
berfungsi dengan baik setelah menghapus ccdan c++ garis, yang menyebabkan kesalahan: cc alternatif tidak dapat menjadi budak dari gcc: ini adalah alternatif utama
palik

7

Sekarang, ada gcc-4.9 yang tersedia untuk Ubuntu / presisi.

Buat grup alternatif kompilator di mana kompiler distro memiliki prioritas lebih tinggi:

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

CATATAN: versi g ++ diubah secara otomatis dengan tombol versi gcc. cpp-bin harus dilakukan secara terpisah karena terdapat alternatif master "cpp".

Buat daftar alternatif kompiler yang tersedia:

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

Untuk memilih gcc, g ++, dan cpp versi 4.9 secara manual, lakukan:

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

Periksa versi kompiler:

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

Kembalikan pengaturan kompiler distro (di sini: kembali ke v4.6):

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

2

Saya menemukan masalah ini saat mencoba menginstal kompiler clang baru. Ternyata baik Debian dan pengelola LLVM setuju bahwa sistem alternatif harus digunakan sebagai alternatif, BUKAN untuk pembuatan versi .

Solusi yang mereka usulkan adalah seperti ini: di
PATH=/usr/lib/llvm-3.7/bin:$PATH
mana /usr/lib/llvm-3.7/bin adalah direktori yang dibuat oleh paket llvm-3.7, dan yang berisi semua alat dengan nama non-sufiksnya. Dengan itu, llvm-config (versi 3.7) muncul dengan nama biasa di PATH Anda. Tidak perlu mengotak-atik symlink, atau memanggil llvm-config-3.7 yang terinstal di / usr / bin.

Juga, periksa paket bernama llvm-defaults (atau gcc-defaults), yang mungkin menawarkan cara lain untuk melakukan ini (saya tidak menggunakannya).


Solusi luar biasa! Saya menggunakannya untuk memilih di antara suite "gcc" yang dibuat khusus
Mad Calm

1

Jika Anda menginginkan cara yang lebih cepat (tetapi masih sangat bersih) untuk mencapainya untuk tujuan pribadi (misalnya jika Anda ingin membangun proyek tertentu yang memiliki beberapa persyaratan kuat terkait versi kompiler), cukup ikuti langkah-langkah berikut:

  • ketik echo $PATHdan cari direktori pribadi yang memiliki prioritas sangat tinggi (dalam kasus saya, saya punya ~/.local/bin);
  • tambahkan tautan simbolis di direktori ini:

Misalnya:

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

Tentu saja, ini akan bekerja untuk satu pengguna (ini bukan solusi luas sistem), tetapi di sisi lain, saya tidak suka mengubah terlalu banyak hal dalam instalasi saya.


Jadi Anda membuat sistem alternatif ad-hoc, paralel-ke-sistem Anda sendiri. Mengapa tidak menggunakan yang asli?
hmijail berduka atas pengunduran diri

@hmijail Seperti yang saya jelaskan, saya menggunakan cara ini ketika saya ingin membangun sebuah proyek tunggal tanpa mengacaukan seluruh instalasi saya. Ini bekerja dengan sangat baik dan saya dapat dengan mudah menghapusnya setelahnya.
Thomas Baruchel

1
Hanya dengan mengubah PATH Anda akan lebih cepat, lebih bersih dan akan membuat alat terkait gcc Anda tetap sinkron satu sama lain.
hmijail berduka atas pengunduran diri

0

Saya hanya menggunakan baris di bawah ini dan berhasil. Aku hanya ingin mengkompilasi VirtualBoxdan VMWare WorkStationmenggunakan kernel 4.8.10di Ubuntu 14.04. Awalnya, kebanyakan hal tidak berfungsi seperti grafik dan jaringan. Saya beruntung yang VMWare workstationdiminta gcc 6.2.0. Saya tidak bisa memulai Genymotion Android emulatorskarena virtualbox saya mati. Akan memposting hasil nanti jika perlu.

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.