Ubuntu에서 기본 GCC 컴파일러를 변경하는 방법은 무엇입니까?


95

이미 gcc / g ++-4.4가있는 우분투 11.04에 gcc-3.3 / g ++-3.3을 설치했습니다. 그래서 내 시스템에서는 gcc-3.3과 4.4를 모두 사용할 수 있습니다. 원하는대로 두 컴파일러를 모두 호출 할 수 있습니다. 명령 gcc을 호출하면 gcc-4.4가 호출됩니다. gcc-3.3을 호출하려면 명령을 사용해야합니다 gcc-3.3.

기본 컴파일러를 gcc-3.3으로 어떻게 변경할 수 있습니까? 명령을 실행하면 gccgcc-4.4가 아닌 gcc-3.3을 호출해야합니다.

또한 make 파일의 변수 CXX를 gcc-3.3으로 변경하려면 어떻게해야합니까? 모든 make 파일을 변경하는 대신 시스템에서 하나의 공통 전역 위치를 변경하고 싶습니다.


2
CXX 플래그를 들어 당신이 호출 할 수 있습니다 CXX=gcc-3.3또는 export CXX=gcc-3.3다음 make그러나 당신은 세계를 변경할 때 update-alternatives이미 GCC-3.3 사용이 필요하지 않습니다.
DipSwitch 2011 년

1
@RoboAlex : CXX 환경 변수 요청을 고려하여 내 답변을 다시 업데이트했습니다. 그러나 나중에 업데이트 대안을 수정하는 경우에만 제공됩니다.
jopasserat

PATH 만 변경하면됩니다. 답변의 대부분은 대안 시스템을 언급하지만, 데비안과 LLVM 메인테이너 모두가 동의 대안 시스템에 사용되어야한다 대안 , NOT을위한 버전 . 내 대답에 더 설명되어 있습니다.
hmijail의 신음은 resignees

답변:


112

@Tommy가 제안했듯이 update-alternatives.
제품군의 모든 소프트웨어에 값을 할당하여 응용 프로그램이 호출되는 순서를 정의합니다.

시스템에서 동일한 소프트웨어의 다른 버전을 유지하는 데 사용됩니다. 귀하의 경우에는의 여러 편각을 사용할 수 gcc있으며 하나가 선호됩니다.

gcc의 현재 우선 순위를 확인하려면 @tripleee의 설명에 표시된 명령을 입력하십시오.

update-alternatives --query gcc

이제 gcc-4.4더 높은 우선 순위 를 gcc-3.3.
대안을 설정하려면 다음과 같은 것이 있어야 합니다 ( gcc설치 위치가 /usr/bin/gcc-3.3에 있고 gcc-4.4의 우선 순위가 50 미만 이라고 가정 ) .

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

--편집하다--

마지막으로의 대화 형 인터페이스를 사용하여 update-alternatives버전간에 쉽게 전환 할 수도 있습니다 . update-alternatives --config gcc설치된 버전 중에서 사용할 gcc 버전을 선택하라는 메시지를 입력 합니다.

-편집 2-

이제 시스템 전체에서 CXX 환경 변수를 수정하려면 @DipSwitch로 표시된 줄을 .bashrc파일 에 넣어야 합니다 (이렇게하면 사용자에게만 변경 사항이 적용되며 제 생각에는 더 안전합니다).

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

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

'update-alternatives --config gcc'를 실행할 때 시스템의 gcc와 anaconda를 가지고 있어도 아무 일도 일어나지 않습니다
Kelthar

그래도 어떻게 자동으로 할 수 있습니까? update-alternatives --query gcc예를 들어 자동화 된 프로비저닝 스크립트에서 작동하지 않을 수 있는의 출력을 확인하려면 수동 단계가 필요합니다 . 또한 어떻게 플랫폼에 구애받지 않게 만들 수 있습니까?
엘리

68

다음은 TL; DR 군중에 대한 jHackTheRipper의 답변에 대한 완전한 예입니다. :-)이 경우에는 기본적으로 4.6 인 Ubuntu 시스템에서 g ++-4.5를 실행하고 싶었습니다. 로 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

여기서 4.6은 여전히 ​​기본값 ( "자동 모드"라고도 함)이지만 명시 적으로 4.5로 일시적으로 전환합니다 (수동 모드). 4.6으로 돌아가려면 :

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

( cpp-bin대신을 사용하는 것에주의하십시오 cpp. Ubuntu에는 이미 cpp마스터 링크 인 /lib/cpp. 해당 링크의 이름을 바꾸면 링크가 제거되어 /lib/cpp스크립트가 손상 될 수 있습니다.)


8
설치된 g ++-5 컴파일러를 기본값으로 설정하려는 미래의 게으른 사람을 위해 :sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100
imallett

한 가지 질문 만 남았습니다. APT는 g++-6패키지를 설치할 때 왜 이렇게하지 않습니까?
rustyx 19.01.26

이런 식으로 기본 컴파일러를 g ++-5로 전환했지만 여전히 g ++-7 표준 라이브러리를 사용하며 이제 정의되지 않은 항목에 오류가 발생합니다 __builtin.
Youda008

22

이것은 마스터 및 슬레이브 (gcc 및 g ++) 대안을 만들고 관리하는 방법에 대한 훌륭한 설명 과 단계별 지침입니다.

곧 :

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과 60은 무엇입니까. gcc-6을 사용하려고합니다.
nyxee

@nyxee 40 및 60은 각 항목에 할당 된 우선 순위를 나타냅니다. 주제에 대한 더 많은 완전성을 위해 다른 답변을 확인하십시오
jopasserat

10

모두 4.8에서 6 사이 --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

그들 사이를 update-alternatives --config gcc.


2
제거 후 잘 작동 cc하며 c++ 오류가 발생합니다. 대안 cc는 gcc의 슬레이브가 될 수 없습니다. 마스터 대안입니다
palik

7

이제 Ubuntu / precise에서 gcc-4.9를 사용할 수 있습니다.

distro 컴파일러의 우선 순위가 더 높은 컴파일러 대안 그룹을 만듭니다.

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

참고 : g ++ 버전은 gcc 버전 스위치를 사용하여 자동으로 변경됩니다. cpp-bin은 "cpp"마스터 대안이 있으므로 별도로 수행해야합니다.

사용 가능한 컴파일러 대안 나열 :

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

gcc, g ++ 및 cpp의 4.9 버전을 수동으로 선택하려면 다음을 수행하십시오.

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

컴파일러 버전 확인 :

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

배포판 컴파일러 설정 복원 (여기 : v4.6으로 돌아 가기) :

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

2

새 clang 컴파일러를 설치하는 동안이 문제를 발견했습니다. 모두 밝혀 데비안LLVM 메인테이너 동의 대안 시스템에 사용하는 것을 대안 하지 않는 버전 .

그들이 제안하는 해결책은 다음과 같습니다.
PATH=/usr/lib/llvm-3.7/bin:$PATH
여기서 /usr/lib/llvm-3.7/bin은 llvm-3.7 패키지에 의해 생성 된 디렉토리이며 접미사가없는 이름을 가진 모든 도구를 포함합니다. 그러면 llvm-config (버전 3.7)가 PATH에 일반 이름으로 나타납니다. 심볼릭 링크를 사용하거나 / usr / bin에 설치된 llvm-config-3.7을 호출 할 필요가 없습니다.

또한 llvm-defaults (또는 gcc-defaults)라는 패키지를 확인하십시오.이 패키지는이를 수행하는 다른 방법을 제공 할 수 있습니다 (사용하지 않았습니다).


탁월한 솔루션! 사용자 지정 "gcc"제품군 중에서 선택하는 데 사용합니다
Mad Calm

1

개인적인 목적 (예를 들어 컴파일러 버전과 관련된 몇 가지 강력한 요구 사항이있는 특정 프로젝트를 빌드하려는 경우)을 위해 더 빠르고 (하지만 여전히 매우 깨끗한) 방법을 원하는 경우 다음 단계를 따르십시오.

  • 우선 순위가 매우 높은 개인 디렉터리를 입력 echo $PATH하고 찾습니다 (제 경우에는 ).~/.local/bin
  • 이 디렉토리에 기호 링크를 추가하십시오.

예를 들면 :

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

물론 이것은 단일 사용자 (시스템 전체 솔루션이 아님)에 대해 작동하지만 다른 한편으로 설치에서 너무 많은 것을 변경하고 싶지 않습니다.


따라서 시스템의 대안 시스템에 대한 임시적인 병렬 시스템을 만들고 있습니다. 실물을 사용하지 않는 이유는 무엇입니까?
hmijail의 신음은 resignees

@hmijail 내가 설명했듯이 전체 설치를 엉망으로 만들지 않고 매우 단일 프로젝트를 빌드하고 싶을 때이 방법을 사용합니다. 그것은 아주 잘 작동하고 나는 그것을 후에 쉽게 제거 할 수 있습니다.
Thomas Baruchel

1
PATH를 변경하는 것만으로도 더 빠르고 깨끗하며 gcc 관련 도구를 서로 동기화 할 수 있습니다.
hmijail의 신음은 resignees

0

아래 줄만 사용했는데 효과가있었습니다. 에서 컴파일 VirtualBox하고 VMWare WorkStation사용 하고 싶었 kernel 4.8.10습니다 Ubuntu 14.04. 처음에는 대부분의 것들이 그래픽과 네트워킹에서 작동하지 않았습니다. VMWare workstation요청한 운이 좋았 습니다 gcc 6.2.0. Genymotion Android emulatorsVirtualbox가 다운 되었기 때문에 시작할 수 없습니다 . 필요한 경우 나중에 결과를 게시합니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.