Pertanyaan Bagaimana cara memilih versi gcc dan g ++ default?


Jadi saya telah menginstal gcc-4.4 dan gcc-4.3 (sama untuk g ++). Sekarang sejauh yang saya ingat ada alat di Ubuntu yang menetapkan symlinks untuk Anda jika Anda hanya mengatakan versi yang Anda inginkan. Namun tampaknya tidak bekerja di versi terbaru, yang menurut saya mengecewakan.

root@nexus:~# update-alternatives --config gcc
update-alternatives: error: no alternatives for gcc.
root@nexus:~# update-alternatives --config cc
There is only one alternative in link group cc: /usr/bin/gcc
Nothing to configure.


root@nexus:~# dpkg -l | grep gcc | awk '{print $2}'
gcc
gcc-4.3
gcc-4.3-base
gcc-4.3-multilib
gcc-4.4
gcc-4.4-base
gcc-4.4-multilib
gcc-4.5-base
gcc-multilib
lib32gcc1
libgcc1

Ada ide?


171
2018-02-15 15:52


asal


Seperti yang dijelaskan @Oli, ini adalah ide yang buruk. Daftar mail Debian-devel: "Saya tidak berpikir alternatif harus digunakan untuk versi. Sebagai contoh, kami tidak menggunakan alternatif untuk gcc, tidak untuk Python." lists.debian.org/debian-devel/2014/06/msg00381.html - hmijail


Jawaban:


Pertama menghapus konfigurasi pembaruan-alternatif saat ini untuk gcc dan g ++:

sudo update-alternatives --remove-all gcc 
sudo update-alternatives --remove-all g++

Instal Paket

Tampaknya kedua gcc-4.3 dan gcc-4.4 dipasang setelah menginstal build-essential. Namun, kami dapat secara eksplisit menginstal paket-paket berikut:

sudo apt-get install gcc-4.3 gcc-4.4 g++-4.3 g++-4.4

Instal Alternatif

Simbolik tautan cc dan c ++ diinstal secara default. Kami akan memasang tautan simbol untuk gcc dan g ++, lalu tautan cc dan c ++ ke gcc dan g ++ masing-masing.

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.3 10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 20

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.3 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 20

sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30
sudo update-alternatives --set cc /usr/bin/gcc

sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30
sudo update-alternatives --set c++ /usr/bin/g++

Konfigurasikan Alternatif

Langkah terakhir adalah mengkonfigurasi perintah default untuk gcc, g ++. Sangat mudah untuk beralih antara 4,3 dan 4,4 secara interaktif:

sudo update-alternatives --config gcc
sudo update-alternatives --config g++

Atau beralih menggunakan skrip:

#!/bin/sh

if [ -z "$1" ]; then
    echo "usage: $0 version" 1>&2
    exit 1
fi

if [ ! -f "/usr/bin/gcc-$1" ] || [ ! -f "/usr/bin/g++-$1" ]; then
    echo "no such version gcc/g++ installed" 1>&2
    exit 1
fi

update-alternatives --set gcc "/usr/bin/gcc-$1"
update-alternatives --set g++ "/usr/bin/g++-$1"

229
2018-02-15 19:05



Thx, jadi Anda harus menambahkannya secara manual untuk memperbarui-alternatif .. IIRC versi Ubuntu sebelumnya melakukannya secara otomatis. - Nils
Ini sangat berguna bagi saya ketika mengkompilasi modul nvidia untuk kernel yang berbeda. Terima kasih banyak telah menjelaskan pembaruan-alternatif - earthmeLon
Terima kasih! Saya menggunakan jawaban Anda yang lain untuk memperbarui dari 4,6 menjadi 4,7. Saya ingin menggunakan jawaban ini, tetapi saya tidak yakin mengapa Anda memasukkan angka seperti 10 20 30 setelah beberapa perintah Anda. Bisakah Anda jelaskan? - Martin Drozdik
Jumlahnya adalah prioritas yang ternyata, sesuai dengan manpage. Saya membayangkan dalam kasus bahwa salah satu versi dihapus instalasinya akan menggunakan prioritas tersebut untuk menentukan mana yang harus menjadi default baru. - Ibrahim
@Ibrahim: Tidak, mereka menentukan apa yang dipilih ketika Anda memilih mode otomatis - Cookie


jalankan di terminal:

gcc -v
g++ -v

Oke, jadi bagian itu cukup sederhana. Bagian yang rumit adalah ketika Anda mengeluarkan perintah GCC, ini sebenarnya adalah tautan simbolis ke versi GCC mana pun yang Anda gunakan. Apa artinya ini adalah kita dapat membuat tautan simbolik dari GCC ke versi mana pun dari GCC yang kita inginkan.

  • Anda dapat melihat tautan simbolik:
ls -la /usr/bin | grep gcc-4.4
ls -la /usr/bin | grep g++-4.4
  • Jadi yang perlu kita lakukan adalah menghapus symlink GCC dan symlink G ++ lalu membuat ulang tautan tersebut ke GCC 4.3 dan G ++ 4.3:
rm /usr/bin/gcc
rm /usr/bin/g++

ln -s /usr/bin/gcc-4.3 /usr/bin/gcc
ln -s /usr/bin/g++-4.3 /usr/bin/g++
  • Sekarang jika kita memeriksa tautan simbolis lagi kita akan melihat GCC & G ++ sekarang tertaut ke GCC 4.3 dan G ++ 4.3:
ls -la /usr/bin/ | grep gcc
ls -la /usr/bin/ | grep g++
  • Akhirnya kami dapat memeriksa GCC -v kami lagi dan memastikan kami menggunakan versi yang benar:
gcc -v
g++ -v

30
2018-02-15 16:49





Apakah ini benar-benar diinginkan? Ada perubahan ABI antara gcc versi. Mengompilasi sesuatu dengan satu versi (mis. Seluruh sistem operasi) dan kemudian menyusun sesuatu yang lain dengan versi lain, dapat menyebabkan konflik.

Sebagai contoh, modul kernel harus selalu dikompilasi dengan versi yang sama gcc digunakan untuk mengkompilasi kernel. Dengan itu dalam pikiran, jika Anda secara manual mengubah symlink antara /usr/bin/gcc dan versi yang digunakan dalam versi Ubuntu Anda, modul DKMS yang dibangun di masa mendatang mungkin menggunakan yang salah gcc versi.

Jika Anda hanya ingin membuat sesuatu dengan versi yang berbeda gcc, itu cukup mudah, bahkan dengan skrip. Misalnya, Anda dapat meneruskan versi gcc dalam CC variabel lingkungan:

CC="gcc-4.5" ./configure
CC="gcc-4.5" make

Anda mungkin tidak membutuhkannya pada perintah make (mengkonfigurasi skrip biasanya menariknya) tetapi tidak sakit.


20
2018-02-15 16:22



Terima kasih atas komentar Anda. Saya menyadari variabel CC, tapi ini bukan pertanyaan sebenarnya. - Nils
Cukup benar tetapi saya telah menjelaskan alasannya gcc bukan bagian dari alternatives sistem dan mengapa hal ini tidak terlalu diinginkan. Jika tidak ada yang akan berubah pikiran, lakukan saja secara manual. - Oli♦
Itu sebelumnya? Sekarang mereka baru saja menghapusnya ?! Kompilasi (userspace) perangkat lunak dengan versi gcc berbeda harus benar-benar ok .. diskusi ini semakin buruk .. - Nils
Bisakah Anda menjelaskan mengapa variabel lingkungan per-panggilan lebih disukai daripada pengaturan konfigurasi sistem-lebar? $ sudo apt-get install gcc-6 gcc-7 $ CC="gcc-7" ./configure <much output> $ make # uses gcc-7 Sedangkan sudo update-alternatives gcc gcc-7 akan memastikan bahwa Anda tidak secara tidak sengaja beralih ABI. - kfsone


Edit:

Ini mengasumsikan bahwa Anda telah menginstal versi pertama, dengan misalnya:

sudo apt install gcc-4.9 g++-4.9

Asli:

Dan di sini adalah satu-liner bagi mereka yang malas, ubah saja mengubah angka di bagian akhir ke versi yang Anda inginkan. Ini akan membuat perubahan gcc dan / atau g ++

ls -la /usr/bin/ | grep -oP "[\S]*(gcc|g\+\+)(-[a-z]+)*[\s]" | xargs bash -c 'for link in ${@:1}; do sudo ln -s -f "/usr/bin/${link}-${0}" "/usr/bin/${link}"; done' 4.9

Dalam contoh ini saya beralih ke 4.9

Tidak ada pemeriksaan kesalahan dan apa yang tidak dalam contoh ini, jadi Anda mungkin ingin memeriksa apa yang akan dijalankan sebelum Anda menjalankannya. Tambahkan saja gemasebelum sudo. Untuk kelengkapan, saya memberikan cek baris juga:

ls -la /usr/bin/ | grep -oP "[\S]*(gcc|g\+\+)(-[a-z]+)*[\s]" | xargs bash -c 'for link in ${@:1}; do echo sudo ln -s -f "/usr/bin/${link}-${0}" "/usr/bin/${link}"; done' 4.9

Output dari cek harus seperti:

sudo ln -s -f /usr/bin/g++-4.9 /usr/bin/g++
sudo ln -s -f /usr/bin/gcc-4.9 /usr/bin/gcc
sudo ln -s -f /usr/bin/gcc-ar-4.9 /usr/bin/gcc-ar
sudo ln -s -f /usr/bin/gcc-nm-4.9 /usr/bin/gcc-nm
sudo ln -s -f /usr/bin/gcc-ranlib-4.9 /usr/bin/gcc-ranlib
sudo ln -s -f /usr/bin/x86_64-linux-gnu-g++-4.9 /usr/bin/x86_64-linux-gnu-g++
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-4.9 /usr/bin/x86_64-linux-gnu-gcc
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-ar-4.9 /usr/bin/x86_64-linux-gnu-gcc-ar
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-nm-4.9 /usr/bin/x86_64-linux-gnu-gcc-nm
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-ranlib-4.9 /usr/bin/x86_64-linux-gnu-gcc-ranlib

Anda dapat memeriksa versi setelah dengan:

gcc --version

Penjelasan semi-detail:

  • ls -la / usr / bin / daftar semua file dalam / usr / bin
  • | pipe (kirim) output ke perintah selanjutnya
  • grep -oP cocok dengan pencarian regex per baris. Hai hanya menunjukkan hasil tidak seluruh garis yang cocok. P memberi tahu grep untuk menggunakan perl-regex. Saya tidak akan masuk ke regex di sini, baca jika Anda mau.
  • xargs Sederhananya, ia mengumpulkan hasil yang disalurkan ke sana dan mengirim semuanya sampai selesai. yaitu ke perintah berikut xargs
  • pesta baik, itu bash. Itu c bendera memberitahukannya untuk menggunakan string sebagai perintah. Dalam contoh ini, ia mengulang argumen yang dikirim dari xargs  dengan melewatkan argumen pertama (ke-0), dalam hal ini loop melompati 4.9. Argumen ke-0 digunakan dalam loop untuk mengubah tautan.
  • ln -s -f Itu s bendera membuat tautan simbolis, f memaksa pembatalan tautan terlebih dahulu jika diperlukan.

10
2017-10-15 20:52



Pertanyaan yang sangat lama, tetapi jawaban ini tampaknya menjadi salah satu permata yang harus kita cari ketika meninjau jawaban atas posting lama ... - mook765
Cemerlang! Jawaban terbaik diserahkan! - Gabriel Staples


Pertimbangkan satu cara meningkatkan:

  • sudo apt install gcc-7
  • sudo apt remove gcc-5

apt akan menangani staf tautan secara otomatis dalam kasus ini. Versi C / C ++ baru cukup kompatibel. Anda hampir tidak akan pernah membutuhkan yang lama.


-1
2017-10-29 20:02