Swapping g++/gcc compiler versions

Nikos emailed me some time back and told me about an alternative way on Ubuntu/debian systems called update-alternatives. I have not gotten around to try it out myself, because I have not had any need for it. Posting part of his email below if anyone want to give it a shot however:
  There is another debian/ubuntu specific fix that is very handy (imho).
  There is a debian utility named update-alternatives which does exatly what you 
  descibed, only it is more sophisticated!
  In case you are interested ( even though cuda 2.3 is supposed to work with 
  ubuntu 9.04):

       sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.1 60 
  --slave /usr/bin/g++ g++ /usr/bin/g++-4.1

      sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.3 40 
  --slave /usr/bin/g++ g++ /usr/bin/g++-4.3

  then you can use sudo update-alternatives --config gcc to choose which version 
  maps to "gcc"

  Original post:

I have been doing CUDA development under GNU/Linux for over a year now, and it works remarkably well. There is one small issue that may confuse developers however; the Nvidia CUDA SDK currently can not handle gcc versions higher than 4.1 . The both newer Ubuntu (I am running Kubuntu) releases - 8.04 and 8.10 have higher versions (4.2 and 4.3 respectively) installed.

There is probably some good page about out how to make the system compile using the right compiler and libc somewhere or some switch to set, but at least I could not find it when installing 8.04 so I had to figure it out back then. As I had to rewrite my script after performing a clean 8.10 install a couple of weeks back I thought it might be handy to post it here. It is a rather straight forward process.

First one need to install gcc4.1 (and g++ if developing in C++) as well as the proper libc version. This can be done using any of the apt tools avaliable in any ubuntu distro, and is fairly straight forward. (Just install the g++4.1 development package, and the rest will follow from dependencies). Do not remove the already installed version (4.2 or 4.3) however, as they can happily coexist and you may want to compile some kernel module or Nvidia driver at some stage.

Second , we must make sure that the right gcc version is used. In usr/bin there are three symbolic links that needs to be changed. gcc, cpp, and g++. If you perform ls of one of the files, like

  $ ls -l /usr/bin/gcc
  lrwxrwxrwx 1 root root 16 2008-11-03 14:14 /usr/bin/gcc -> /usr/bin/gcc-4.3

you can see that it is a link to gcc-4.3 (a binary file). Same thing goes for cpp and g++ . There should also be binary files for the corresponding 4.1 version (e.g gcc-4.1). One way of changing the compiler version used by the system is simply a matter of removing this link and making a new one to the proper executable. As it may come in handy to change back (I tend to want to use the newest g++ when developing non CUDA software) and forth, a couple of simple shell scripts will come in handy. To set the compiler version to 4.1 simply put the following in a file, and save it in som convenient location (I save in /usr/bin for simplicity). I call my file setcompiler4.1.sh but you can of course choose your own names.

  rm /usr/bin/cpp
  ln -s /usr/bin/cpp-4.1 /usr/bin/cpp
  echo ln -s cpp-4.1 cpp
  rm /usr/bin/gcc
  ln -s /usr/bin/gcc-4.1 /usr/bin/gcc
  echo ln -s gcc-4.1 gcc
  rm /usr/bin/g++
  ln -s /usr/bin/g++-4.1 /usr/bin/g++
  echo ln -s g++-4.1 g++

If you are not comfortable with shell scripting (I am but a rookie myself), rm removes the link, ln creates a link (-s makes it a soft link) and echo merely echoes the argument (I do this just to remind myself what is happening).

Put a similar thing for 4.2 and, or 4.3 in its own file, so that you easily can reset, and make sure that the shell scripts are executable

  sudo chmod +x set_compiler_4.1.sh

  Now to set a a compiler version, simply call the script with superuser privileges

  sudo set_compiler_4.1.sh

for instance.

That is about it. Long text for a simple fix… Ah, and be careful with those rm's in superuser mode if you are new to GNU/Linux.