在不同的GCC版本之间切换

6
我最近构建了一个旧版本的GCC并将其安装在我的主目录下(具体来说是〜/local/gcc-5.3.0)。然而,我只需要这个编译器用于CUDA项目,并且其余时间将使用系统编译器(GCC 6.2.1)。因此,我想我需要找到一种方法,在需要时在它们之间切换,并以适当的方式更改库和包含路径。
我知道update-alternatives是一种实现这一点的方法,但似乎需要设置root权限,而我没有这个权限。
接下来最好的方法可能是在.bashrc中编写一个shell函数,确保以下内容:
  • 每次调用都会在系统和本地gcc之间切换

  • 无论何时进行切换,它都会调整路径,以便在选择本地gcc时,它首先查找由其自身安装的头文件和库,然后再查找系统路径,例如/usr/local/includeusr/local/lib。之前的answer建议修改LD_LIBRARY_PATH应该就足够了,因为GCC安装程序“知道”其自己的头文件和静态库在哪里(我不确定是否正确,我在想我可能需要修改CPATH等)。

上述方式是实现此目标的最佳方法吗?如果是,请问在实现此功能时应设置哪些路径?


我的个人做法并不是很复杂:我有一个 shell 脚本,它只是将 CUDA bin 目录和匹配的 gcc bin 目录添加到 $PATH 中。实际上,我有多个脚本来保留不同版本的 CUDA。当我停止使用 CUDA 或想要切换到另一个版本时,我会打开一个新的 shell。 - tera
您提到只需将gcc的bin目录添加到PATH中。如果不涉及包含目录,修改LD_LIBRARY_PATH是否也是必要的呢? - oczkoisse
1
无论是nvcc还是gcc都知道它们的库文件所在的位置,因此只需更改$PATH即可。 - tera
如果这只是针对nvcc的话,那么你可能只需要在nvcc中使用ccbin选项。 - talonmies
CMake 能轻松处理这个问题吧? - Matt Schuchard
1个回答

3
以下是否最佳方法实现此操作?如果是,那么在实施此函数时应设置哪些路径?
正如其他人指出的那样,PATH和LD_LIBRARY_PATH是必需的。为了完整起见,您还可以更新MANPATH。
与其在.bashrc中重新发明轮子,我建议使用一个鲜为人知但非常方便和模块化的环境模块Environment Modules,它们是针对这个特定目的而设计的。您可以像这样使用它们(一旦您为gcc/3.1.1设置了配置):
$ module load gcc/3.1.1
$ which gcc
/usr/local/gcc/3.1.1/linux/bin/gcc
$ module unload gcc
$ which gcc
gcc not found

似乎是一个相当不错的工具来配置Shell环境变量。现在只需要找出如何为我的目的编写实际的模块文件。感谢您的帮助。 - oczkoisse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接