기본 gcc 및 g ++ 버전을 선택하는 방법은 무엇입니까?


206

그래서 gcc-4.4와 gcc-4.3을 설치했습니다 (g ++과 동일). 내가 기억하는 한 우분투에는 원하는 버전을 알려 주면 심볼릭 링크를 설정하는 도구가 있습니다. 그러나 최신 버전에서는 작동하지 않는 것 같습니다.

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

어떤 아이디어?


1
@Oli가 설명했듯이 이것은 나쁜 생각입니다. 데비안 개발 메일 목록 : "다른 대안을 버전 관리에 사용해야한다고 생각하지 않습니다. 예를 들어, 우리는 gcc를위한 대안을 사용하지 않으며, 파이썬을 위해서도 사용하지 않습니다." lists.debian.org/debian-devel/2014/06/msg00381.html
hmijail

1
좋아, 그럼 무엇을 당신은 버전에 사용?
WillC

답변:


271

먼저 gcc 및 g ++에 대한 현재 업데이트 대안 설정을 지 웠습니다.

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

패키지 설치

gcc-4.3과 gcc-4.4는 모두 build-essential 설치 후 설치되는 것 같습니다. 그러나 다음 패키지를 명시 적으로 설치할 수 있습니다.

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

대안 설치

cc 및 c ++ 기호 링크가 기본적으로 설치됩니다. gcc와 g ++에 대한 심볼 링크를 설치 한 다음 cc와 c ++를 각각 gcc와 g ++에 연결합니다. (그 주 10, 2030옵션은 각 대안에 대한 우선 순위입니다.)

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++

대안 구성

마지막 단계는 gcc, g ++에 대한 기본 명령을 구성하는 것입니다. 4.3과 4.4를 대화식으로 쉽게 전환 할 수 있습니다.

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

또는 스크립트를 사용하여 전환하십시오.

#!/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"

4
Thx, 그래서 당신은 업데이트 대안을 위해 수동으로 추가해야합니다. IIRC 이전 우분투 버전은 자동으로 수행했습니다.
Nils

1
이것은 다른 커널에 대해 NVIDIA 모듈을 컴파일 할 때 특히 유용합니다. 업데이트 대안을 설명해 주셔서 대단히 감사합니다
earthmeLon

1
감사합니다! 다른 답변을 사용하여 4.6에서 4.7로 업데이트했습니다. 이 답변을 사용하고 싶었지만 일부 명령 후에 10 20 30과 같은 숫자를 왜 넣었는지 잘 모르겠습니다. 설명해 주시겠습니까?
Martin Drozdik

7
맨 페이지에 따르면 숫자는 우선 순위입니다. 버전 중 하나가 제거되는 경우 우선 순위를 사용하여 어느 것이 새 기본값이되어야하는지 결정합니다.
Ibrahim

1
@Ibrahim : 아니요. 자동 모드를 선택할 때 선택되는 내용이 결정됩니다
Cookie

41

터미널에서 실행 :

gcc -v
g++ -v

좋아요, 그래서 그 부분은 매우 간단합니다. 까다로운 부분은 GCC 명령을 실행할 때 실제로 사용중인 GCC 버전에 대한 심볼릭 링크라는 것입니다. 이것이 의미하는 바는 GCC에서 원하는 버전의 GCC로 심볼릭 링크를 만들 수 있다는 것입니다.

  • 심볼릭 링크를 볼 수 있습니다.
ls -la /usr/bin | grep gcc-4.4
ls -la /usr/bin | grep g++-4.4
  • 따라서 우리가해야 할 일은 GCC symlink와 G ++ symlink를 제거한 다음 GCC 4.3 및 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++
  • 이제 심볼릭 링크를 다시 확인하면 GCC 및 G ++가 GCC 4.3 및 G ++ 4.3에 연결됩니다.
ls -la /usr/bin/ | grep gcc
ls -la /usr/bin/ | grep g++
  • 마지막으로 GCC -v를 다시 확인하고 올바른 버전을 사용하고 있는지 확인할 수 있습니다.
gcc -v
g++ -v

1
정확히 내가 찾던 것! 내가 설치 한 모든 버전에 "gcc"를 링크하는 기능을 잊어 버렸습니다. 감사!
CalebHC

더 간단하고 쉽고 안전한 방법!
sailfish009

21

이것이 정말로 바람직한가? gcc버전 간에 ABI 변경이 있습니다. 한 버전 (예 : 전체 운영 체제)으로 무언가를 컴파일 한 다음 다른 버전으로 무언가를 컴파일하면 충돌이 발생할 수 있습니다.

예를 들어, 커널 모듈은 항상 커널 컴파일에 사용 된 것과 동일한 버전 gcc으로 컴파일해야합니다. 이를 염두에두고 /usr/bin/gccUbuntu 버전에 사용 된 버전과 버전 사이의 심볼릭 링크를 수동으로 변경 한 경우 향후 DKMS 작성 모듈에서 잘못된 gcc버전을 사용할 수 있습니다 .

다른 버전의으로 물건을 만들고 싶다면 gccmakescript로도 쉽습니다. 예를 들어, 버전에 전달할 수 gcc에서 CC환경 변수 :

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

make 명령에서 필요하지 않을 수도 있지만 (구성 스크립트는 일반적으로 가져옵니다) 아프지 않습니다.


1
귀하의 의견에 대한 Thx. CC 변수를 알고 있지만 실제로 문제는 아닙니다.
Nils

2
사실이지만 시스템의 gcc일부가 아닌 alternatives이유와 이것이 특히 바람직하지 않은 이유를 설명했습니다. 그중 어느 것도 마음을 바꾸지 않는다면 수동으로하십시오.
Oli

1
이전에? 이제 그들은 방금 그것을 제거 했습니까?! 다른 GCC 버전과 컴파일 (사용자 공간) 소프트웨어는이 토론 문턱지고 .. 완벽하게 확인을해야 ..
닐스

1
호출 단위 환경 변수가 시스템 전체 구성 설정보다 선호되는 이유를 설명 할 수 있습니까? $ sudo apt-get install gcc-6 gcc-7 $ CC="gcc-7" ./configure <much output> $ make # uses gcc-7 반면 sudo update-alternatives gcc gcc-7실수로 ABI를 전환하지 않도록해야합니다.
kfsone

14

편집하다:

예를 들어 다음과 같이 버전을 먼저 설치했다고 가정합니다.

sudo apt install gcc-4.9 g++-4.9

기발한:

그리고 여기 게으른 사람들을위한 하나의 라이너가 있습니다. 끝에있는 숫자를 원하는 버전으로 변경하십시오. gcc 및 / 또는 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

이 예에서는 4.9로 전환했습니다

이 예에는 오류 점검이없고 수행하지 않은 것이 있으므로 실행하기 전에 실행할 내용을 점검 할 수 있습니다. sudo 전에 echo 를 추가하십시오 . 완전성을 위해 체크 라인도 제공합니다.

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

검사 결과는 다음과 같아야합니다.

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

다음을 수행 한 후 버전을 확인할 수 있습니다.

gcc --version

자세한 설명 :

  • LS -la는 / usr / 빈 / 의 목록을 모든 파일 은 / usr / 빈
  • | 다음 명령으로 출력을 파이프 (보내기)
  • grep -oP줄당 검색 정규식과 일치합니다. o 일치하는 전체 행이 아닌 결과 만 표시합니다. P 는 grep에게 perl-regex를 사용하도록 지시합니다. 나는 정규식에 들어 가지 않을 것입니다. 원한다면 읽으십시오.
  • xargs는 간단히 말해서 파이프 된 결과를 수집하고 모든 결과를 끝까지 보냅니다. 즉 xargs 다음의 명령
  • 배쉬 , 배쉬입니다. C의 플래그는 명령으로 문자열을 사용하도록 지시합니다. 이 예제에서는 첫 번째 (0) 인수를 건너 뛰어 xargs 에서 보낸 인수를 반복 합니다. 이 경우 루프는 4.9를 건너 뜁니다 . 루프에서 0 번째 인수는 링크를 변경하는 데 사용됩니다.
  • LN -s -f 의의 플래그가 심볼릭 링크, 수 F 필요한 경우 먼저 분리에 힘을.

2
아주 오래된 질문이지만,이 답변은 오래된 게시물에 대한 답변을 검토 할 때 찾아야 할 보석 중 하나 인 것 같습니다.
mook765

훌륭한! 가장 좋은 답변은 아래로!
Gabriel Staples

-1

임시 디렉토리의 심볼릭 링크는 어떻습니까?

mkdir x && PATH=$PWD/x:$PATH && ln -s /usr/bin/g++-7 $PWD/x/g++


나는 인정해야한다 : 이것은 훌륭한 해답이다.
user643722
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.