Làm cách nào để thay đổi trình biên dịch GCC mặc định trong Ubuntu?


95

Tôi đã cài đặt gcc-3.3 / g ++ - 3.3 trên ubuntu 11.04 đã có gcc / g ++ - 4.4. Vì vậy, trong hệ thống của tôi, cả gcc-3.3 và 4.4 đều có sẵn. Tôi có thể gọi cả hai trình biên dịch như tôi muốn. Nếu tôi chỉ gọi lệnh gccthì gcc-4.4 sẽ được gọi. Để gọi gcc-3.3, tôi phải sử dụng lệnh gcc-3.3.

Làm cách nào để thay đổi trình biên dịch mặc định là gcc-3.3? Khi tôi thực hiện lệnh, gccnó sẽ gọi gcc-3.3 chứ không phải gcc-4.4.

Ngoài ra, làm cách nào để thay đổi biến CXX trong tệp tạo thành gcc-3.3? Tôi muốn thay đổi một nơi chung chung trong hệ thống thay vì thay đổi tất cả các tệp tạo.


2
Đối với cờ CXX, bạn có thể gọi CXX=gcc-3.3hoặc export CXX=gcc-3.3và sau đó, maketuy nhiên, khi bạn thay đổi nó trên toàn cầu, update-alternativesnó sẽ sử dụng gcc-3.3 và điều này là không cần thiết.
DipSwitch vào

1
@RoboAlex: đã cập nhật lại câu trả lời của tôi để tính đến yêu cầu biến môi trường CXX của bạn. Tuy nhiên, xin lưu ý rằng nó sẽ chỉ phục vụ trong trường hợp bạn sửa đổi các lựa chọn thay thế cập nhật sau này.
jopasserat

Bạn chỉ cần thay đổi PATH của mình. Hầu hết các câu trả lời đều đề cập đến hệ thống lựa chọn thay thế, nhưng cả người bảo trì Debian và LLVM đều đồng ý rằng hệ thống lựa chọn thay thế nên được sử dụng cho các lựa chọn thay thế , KHÔNG phải để tạo phiên bản . Giải thích thêm trong câu trả lời của tôi.
hmijail than khóc những người từ chức

Câu trả lời:


112

Như @Tommy đã đề xuất, bạn nên sử dụng update-alternatives.
Nó chỉ định các giá trị cho mọi phần mềm của một họ, để nó xác định thứ tự mà các ứng dụng sẽ được gọi.

Nó được sử dụng để duy trì các phiên bản khác nhau của cùng một phần mềm trên một hệ thống. Trong trường hợp của bạn, bạn sẽ có thể sử dụng một số từ gccvà một sẽ được ưu tiên.

Để tìm ra các ưu tiên hiện tại của gcc, hãy nhập lệnh được chỉ ra trong nhận xét của @ tripleee:

update-alternatives --query gcc

Bây giờ, hãy lưu ý mức độ ưu tiên được quy cho gcc-4.4bởi vì bạn sẽ cần cấp độ ưu tiên cao hơn cho gcc-3.3.
Để thiết lập các lựa chọn thay thế của bạn, bạn nên có một cái gì đó như thế này (giả sử gcccài đặt của bạn được đặt tại /usr/bin/gcc-3.3gcc-4.4mức độ ưu tiên của nó nhỏ hơn 50) :

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

--biên tập--

Cuối cùng, bạn cũng có thể sử dụng giao diện tương tác của update-alternativesđể dễ dàng chuyển đổi giữa các phiên bản. Nhập update-alternatives --config gccđược yêu cầu để chọn phiên bản gcc bạn muốn sử dụng trong số những phiên bản đã cài đặt.

- sửa 2 -

Bây giờ, để khắc phục biến môi trường CXX trên toàn hệ thống, bạn cần đặt dòng được chỉ ra bởi @ DipSwitch's trong .bashrctệp của mình (điều này sẽ chỉ áp dụng thay đổi cho người dùng của bạn, theo ý kiến ​​của tôi là an toàn hơn):

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

1
@thang còn gọi là cc:root@host:/root# update-alternatives --get-selections | grep '/usr/bin/gcc' cc auto /usr/bin/gcc
jopasserat

Khi tôi chạy 'update-alternatives --config gcc', không có gì xảy ra, mặc dù tôi có gcc của hệ thống và Anaconda một
Kelthar

làm thế nào bạn có thể làm điều này tự động mặc dù? điều này yêu cầu một bước thủ công để kiểm tra kết quả đầu ra update-alternatives --query gcc, có thể không hoạt động, ví dụ như trong tập lệnh cấp phép tự động. Ngoài ra, làm thế nào điều này có thể được làm cho nền tảng bất khả tri?
ely

68

Đây là một ví dụ hoàn chỉnh về câu trả lời của jHackTheRipper cho đám đông TL; DR. :-) Trong trường hợp này, tôi muốn chạy g ++ - 4.5 trên hệ thống Ubuntu mặc định là 4.6. Như 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

Ở đây, 4.6 vẫn là mặc định (còn gọi là "chế độ tự động"), nhưng tôi rõ ràng tạm thời chuyển sang 4.5 (chế độ thủ công). Để quay lại 4.6:

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

(Lưu ý sử dụng cpp-binthay vì chỉ cpp. Ubuntu đã có một giải cpppháp thay thế với một liên kết chính của /lib/cpp. Đổi tên liên kết đó sẽ xóa /lib/cppliên kết, điều này có thể phá vỡ các tập lệnh.)


8
Đối với những người lười biếng trong tương lai đang cố gắng đặt trình biên dịch g ++ - 5 đã cài đặt làm mặc định:sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100
imallett

Chỉ còn lại một câu hỏi: tại sao APT không thực hiện điều này khi cài đặt g++-6gói?
gỉyx

Tôi đã chuyển trình biên dịch mặc định sang g ++ - 5 theo cách này, nhưng nó vẫn sử dụng thư viện tiêu chuẩn g ++ - 7 và bây giờ tôi đang gặp lỗi với __builtinnội dung không xác định .
Youda008

22

Đây là mô tả tuyệt vời và hướng dẫn từng bước cách tạo và quản lý các lựa chọn thay thế chính và phụ (gcc và g ++).

Ngắn gọn là:

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

những gì với 40 và 60. Tôi đang cố gắng sử dụng gcc-6.
nyxee

@nyxee 40 và 60 biểu thị ưu tiên được gán cho mỗi entry, đánh dấu vào câu trả lời khác cho đầy đủ hơn về chủ đề này
jopasserat

9

Từ 4,8 đến 6 với tất cả --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

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

Thay đổi giữa chúng với update-alternatives --config gcc.


1
hoạt động tốt sau khi gỡ bỏ ccc++ đường nét, mà nguyên nhân lỗi: cc thay thế không thể nô lệ của gcc: nó là một sự thay thế chủ
Palik

7

Bây giờ, đã có gcc-4.9 cho Ubuntu / precision.

Tạo một nhóm các lựa chọn thay thế trình biên dịch trong đó trình biên dịch distro có mức độ ưu tiên cao hơn:

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

LƯU Ý: Phiên bản g ++ được thay đổi tự động bằng chuyển đổi phiên bản gcc. cpp-bin phải được thực hiện riêng biệt vì tồn tại một thay thế chính "cpp".

Liệt kê các lựa chọn thay thế trình biên dịch có sẵn:

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

Để chọn phiên bản 4.9 của gcc, g ++ và cpp theo cách thủ công, hãy thực hiện:

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

Kiểm tra các phiên bản trình biên dịch:

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

Khôi phục cài đặt trình biên dịch distro (tại đây: quay lại v4.6):

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

2

Tôi đã tìm thấy sự cố này khi cố gắng cài đặt trình biên dịch clang mới. Hóa ra là cả người bảo trì DebianLLVM đều đồng ý rằng hệ thống lựa chọn thay thế nên được sử dụng cho các lựa chọn thay thế, KHÔNG phải để tạo phiên bản .

Giải pháp mà họ đề xuất là một cái gì đó như sau:
PATH=/usr/lib/llvm-3.7/bin:$PATH
trong đó /usr/lib/llvm-3.7/bin là một thư mục được tạo bởi gói llvm-3.7 và chứa tất cả các công cụ có tên không hậu tố của chúng. Cùng với đó, llvm-config (phiên bản 3.7) xuất hiện với tên đơn giản trong PATH của bạn. Không cần phải lặp lại với các liên kết tượng trưng, ​​cũng như không gọi llvm-config-3.7 đã được cài đặt trong / usr / bin.

Ngoài ra, hãy kiểm tra một gói có tên llvm-defaults (hoặc gcc-defaults), có thể cung cấp cách khác để thực hiện việc này (tôi không sử dụng nó).


Giải pháp tuyệt vời! Tôi sử dụng nó để chọn trong số các suite "gcc" được xây dựng tùy chỉnh
Mad Calm

1

Trong trường hợp bạn muốn một cách nhanh hơn (nhưng vẫn rất rõ ràng) để đạt được nó cho mục đích cá nhân (ví dụ: nếu bạn muốn xây dựng một dự án cụ thể có một số yêu cầu mạnh mẽ liên quan đến phiên bản của trình biên dịch), chỉ cần làm theo các bước sau:

  • echo $PATHvà tìm kiếm thư mục cá nhân có mức ưu tiên rất cao (trong trường hợp của tôi, tôi có ~/.local/bin);
  • thêm các liên kết tượng trưng trong thư mục này:

Ví dụ:

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

Tất nhiên, điều này sẽ hoạt động đối với một người dùng (nó không phải là giải pháp toàn hệ thống), nhưng mặt khác, tôi không muốn thay đổi quá nhiều thứ trong cài đặt của mình.


Vì vậy, bạn đang tạo hệ thống lựa chọn thay thế đặc biệt, song song với hệ thống của riêng mình. Tại sao không sử dụng đồ thật?
thương tiếc hmijail resignees

@hmijail Như tôi đã giải thích, tôi sử dụng cách này khi tôi muốn xây dựng một dự án đơn lẻ mà không làm rối tung toàn bộ cài đặt của mình. Nó hoạt động rất tốt và tôi có thể dễ dàng gỡ bỏ nó sau đó.
Thomas Baruchel

1
Chỉ cần thay đổi PATH của bạn sẽ nhanh hơn, sạch hơn và sẽ giữ cho các công cụ liên quan đến gcc của bạn đồng bộ với nhau.
hmijail than khóc những người từ chức

0

Tôi chỉ sử dụng các dòng bên dưới và nó hoạt động. Tôi chỉ muốn biên dịch VirtualBoxVMWare WorkStationsử dụng kernel 4.8.10trên Ubuntu 14.04. Ban đầu, hầu hết mọi thứ đều không hoạt động, ví dụ như đồ họa và mạng. Tôi đã may mắn được VMWare workstationyêu cầu gcc 6.2.0. Tôi không thể khởi động Genymotion Android emulatorsvì hộp ảo đã bị lỗi. Sẽ đăng kết quả sau nếu cần thiết.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.