Dependencies


  • Ubuntu
  • build-essentials

Problems


필자는 보통의 프로젝트를 빌드할 땐, 가장 최신 버전인 gcc-5를 사용해왔다. 하지만 최근 운영체제론 수업 과제 때문에 pintos를 컴파일하는 과정에서 gcc-5를 사용해 컴파일했더니 make check에서 제대로 Pass되어야 할 Thread도 Fail이 뜨는 경우가 있었다. pintos의 여러 가이드에서 권장하는 gcc-4.4를 추가로 설치해야했다.

리눅스 환경에서 gcc를 이용해 컴파일을 하다보면, 버전 의존성 때문에 오류가 생길 때가 많다. 그렇다고 그럴때마다 gcc를 다른 버전으로 새로 설치하는 것은 번거로움이 크다. 이번 포스트에선 gcc의 이전 버전이나 새로운 버전을 추가로 설치하여 update-alternatives 명령어로 버전을 바꿔 사용하는 방법을 알아볼 것이다. gcc-5gcc-4.4를 기준으로 설명하겠다.


How to Solve It


build-essentials이 설치되어 있지 않다면 아래 명령어를 입력하여 설치하자.

$ sudo apt-get update
$ sudo apt-get install build-essentials

이전 버전이나 새로운 버전의 gcc를 설치하려면 보통의 방법으로 그냥 설치하면 되지만, 간혹 해당 버전이 Ubuntu Source Repository에 등록이 되어 있지 않아 설치가 안되는 경우가 있다. 만약 그렇다면, 아래의 과정을 따라하자.

$ gedit /etc/apt/sources.list

를 입력하고 편집기 창이 열리면 마지막 라인에 다음을 추가하자.

deb http://dk.archive.ubuntu.com/ubuntu/ trusty main universe
deb http://dk.archive.ubuntu.com/ubuntu/ trusty-updates main universe

위의 과정을 마치고 아래의 명령어를 입력하면 gcc-4.4g++-4.4가 성공적으로 설치될 것이다.

$ sudo apt-get install gcc-4.4 gcc-4.4-multilib g++-4.4 g++-4.4-multilib

현재 설치된 여러 버전의 gcc를 확인해보고 싶으면 아래의 명령어를 입력하면 된다.

$ sudo dpkg -l | grep gcc | awk '{print $2}'

또 현재 설치되어 사용중인 gcc의 버전을 확인하고 싶으면 아래의 명령어를 입력하면 된다.

$ gcc --version
$ g++ --version

이제 동시에 설치한 여러 버전의 gccupdate-alternatives로 관리해야 하는데, Ubuntu가 해당 패키지에 alternatives를 자동으로 설정할 수 도 있지만 그렇지 않으면 사용자가 수동으로 설정해주어야 한다.

$ sudo update-alternatives --display gcc

를 입력하면 현재 gcc에 alternatives가 설정되어 있는지 확인할 수 있다. 그렇지 않다면 아래 명령어를 입력해 수동으로 추가해줘야 한다.

$ sudo update-alternatives --install <link> <name> <path> <priority>
arguments meaning
link 실행 파일의 이름으로 /etc/alternatives/을 가리킨다. (예: /usr/bin/gcc)
name 해당 링크 그룹의 대표 이름으로, 여러 가지 버전의 패키지들을 대표하는 이름으로 보면 된다. (예: gcc)
path alternatives로 실제 연결할 실행 파일의 이름으로, 시스템에 설치한 패키지의 실행 파일 이름이다. (예: /usr/bin/gcc-4.4)
priority automatic 모드에서 어떤 것을 자동으로 선택해서 사용할지 결정할 때 사용되는 우선순위로, 높은 수가 더 높은 우선순위이다.

실제로 gcc-5gcc-4.4를 alternatives에 등록하고 우선순위를 설정하려면 아래와 같은 명령을 수행하면 된다.

$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 40
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 20

gcc-5의 우선순위가 더 높으므로 automatic 모드에선 gcc를 입력하면 기본적으로 gcc-5를 사용하게 된다.

지금은 두 버전의 gcc를 alternatives에 등록만 해두었을 뿐, update-alternatives를 사용하여 실제로 버전을 바꾼 것이 아니므로, 여전히 gcc-5를 사용하고 있는 것이다.

gcc을 다른 버전으로 바꾸려면 아래의 update-alternatives 명령을 수행해야 한다.

$ sudo update-alternatives --config gcc
대체 항목 gcc에 대해 (/usr/bin/gcc 제공) 2개 선택이 있습니다.

  선택       경로            우선순위 상태
------------------------------------------------------------
* 0            /usr/bin/gcc-5     40        자동 모드
  1            /usr/bin/gcc-4.4   20        수동 모드
  2            /usr/bin/gcc-5     40        수동 모드

Press <enter> to keep the current choice[*], or type selection number:

설정하고자 하는 패키지의 인덱스 넘버를 입력한 후 엔터키를 치면 해당 버전으로 전환된다.


$ gcc --version

으로 gcc버전이 바뀐 것을 확인할 수 있다. 다른 패키지도 이런 방법으로 버전 관리를 할 수 있다.