Conda gcc 不会替换系统 gcc

Posted

技术标签:

【中文标题】Conda gcc 不会替换系统 gcc【英文标题】:Conda gcc does not replace system gcc 【发布时间】:2018-10-28 10:34:32 【问题描述】:

我正在尝试在 Conda 环境中编译一些代码,其中我 之前安装了编译包gcc_linux-64

但是,即使在停用并重新激活环境之后, gcc 仍然是 /usr/bin/gcc

我应该怎么做才能让 Conda 按预期工作,即。使用工具 我安装?就像 git 或其他软件一样。

任何帮助将不胜感激,在此先感谢!

【问题讨论】:

我相信可执行文件名为gcc-conda 或类似名称。见:conda.io/docs/user-guide/tasks/build-packages/… 好的,但是 makefile 等使用 'gcc' 而不是 'gcc-conda'... 如果不替换系统 gcc,那么使用 Conda 安装 gcc 有什么意义?例如,在安装 git 时,它不被称为 'git-conda' 您通常可以使用环境变量来控制 Makefile 中变量的值。我不确定他们为什么做出这个决定,但可能是因为编译器对系统操作更为基础,并且替换它(即使将其放在路径中)比其他程序更可能导致链接问题等(如 git)。 感谢 cmets @darthbith ......不过,这对我来说似乎很奇怪。有时我认为我会更好地使用 nix 而不是 Conda 使用 nix 代替 Conda 是什么意思?它们是完全独立的...... *nix 意味着一个操作系统,而 Conda 只是一个包管理器(适用于任何平台)...... 【参考方案1】:

如果你这样做:

export CONDA_BUILD=1
conda activate <name-of-env-in-which-gcc_linux-64-is-installed>

你会看到:

INFO: activate-binutils_linux-64.sh made the following environmental changes:
+ADDR2LINE=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-addr2line
+AR=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-ar
+AS=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-as
+CXXFILT=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-c++filt
+ELFEDIT=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-elfedit
+GPROF=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-gprof
+LD=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-ld
+LD_GOLD=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-ld.gold
+NM=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-nm
+OBJCOPY=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-objcopy
+OBJDUMP=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-objdump
+RANLIB=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-ranlib
+READELF=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-readelf
+SIZE=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-size
+STRINGS=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-strings
+STRIP=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-strip
INFO: activate-gcc_linux-64.sh made the following environmental changes:
+CC=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-cc
+CFLAGS=-march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -pipe -I/include -fdebug-prefix-map=$SRC_DIR=/usr/local/src/conda/$PKG_NAME-$PKG_VERSION -fdebug-prefix-map=$PREFIX=/usr/local/src/conda-prefix
+CPP=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-cpp
+CPPFLAGS=-DNDEBUG -D_FORTIFY_SOURCE=2 -O2
+DEBUG_CFLAGS=-march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-all -fno-plt -Og -g -Wall -Wextra -fvar-tracking-assignments -pipe -I/include -fdebug-prefix-map=$SRC_DIR=/usr/local/src/conda/$PKG_NAME-$PKG_VERSION -fdebug-prefix-map=$PREFIX=/usr/local/src/conda-prefix
+DEBUG_CPPFLAGS=-D_DEBUG -D_FORTIFY_SOURCE=2 -Og
+GCC=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-gcc
+GCC_AR=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-gcc-ar
+GCC_NM=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-gcc-nm
+GCC_RANLIB=/root/m3/envs/test/bin/x86_64-conda_cos6-linux-gnu-gcc-ranlib
+LDFLAGS=-Wl,-O2 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,--disable-new-dtags -Wl,-rpath,/lib -L/lib
+_CONDA_PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata_x86_64_conda_cos6_linux_gnu

在您的 make 文件中,您可以改用 $CC 之类的变量。

【讨论】:

我没有导出 CONDA_BUILD 也有同样的结果;仍然,gcc 是系统 gcc。 makefile 不是我写的,我不想修改它。 是的,gcc 将始终保持系统 gcc。您需要改用 $CC。我刚刚导出了 CONDA_BUILD 变量以显示激活环境时的详细输出。 我遇到了和 OP 一样的问题。我认为没有必要更改生成文件。我认为应该更改gcc。来自docs.conda.io/projects/conda-build/en/latest/resources/…:“代替 gcc,您使用的编译器的可执行名称将类似于 x86_64-conda_cos6-linux-gnu-gcc [...]。许多构建工具(例如 make 和 CMake)默认搜索编译器仅命名为 gcc,因此我们设置环境变量以将这些工具指向正确的编译器。[...] Conda-build 为您执行此激活”。除非它没有。 @sigvaldm 不确定您是否解决了这个问题 - 我刚刚遇到了同样的问题。为了在 conda env 中编译我的 c 脚本,我发现使用环境定义的 env 变量来调用环境的 gcc 编译器是有效的:$GCC -o program program.c。我是C的菜鸟,实际上只是学习hello world;所以 make 工具超出了我的范围;话虽如此,如果您只想使用 env 编译器而不是系统进行编译,则 env 变量虽然可能不直观,但效果很好。 谢谢你,@skytwosea。是的,我已经把它整理出来了,虽然我不再记得怎么做了。一旦你得到许多文件和参数,你可能想看看 makefiles(下一步是 CMake)。它将为您执行正确的命令。当您下载第 3 方软件时,您不想更改他们的文件,因此进入他们的 makefile 并键入 $(GCC) 不是一个好的选择。通常此类文件使用变量 $(CC) 而不是 gcc,因此您可以设置它。我不记得我的示例是否没有这样做,或者 Anaconda 当时没有设置 $(CC) 。不管怎样,欢迎来到 C 世界:)【参考方案2】:

问题是 conda 安装的 gcc 编译器的名称。因为它不仅仅是gcc,它是一些很长很复杂的东西,例如。 x86_64-conda_cos6-linux-gnu-gcc,它不会覆盖系统可执行文件,即使你的 conda 目录在你的 PATH 中更早变量。

解决方案是将您的 conda gcc 编译器软链接到您的本地二进制目录,例如。 ln -s path/to/conda/gcc ~/.local/bin/gcc,然后将其放在您的系统二进制目录之前的 PATH 变量中,例如。 export PATH=$HOME/.local/bin:$PATH 你的 shell 的来源,ie. ~/.bashrc, ~/.bash_profile, ~/.zshrc, 等等。

这将指向你的 conda 可执行文件在系统之前,并且应该有适当的名称来覆盖它。

请记住,如果您删除您的环境,或替换/更新安装在其中的 gcc,您将需要相应地更新软链接。除非您需要许多不同的 gcc 版本,否则我只需将其安装到您的基本环境中,进行软链接,然后不要碰它。哈克,但它有效。

【讨论】:

以上是关于Conda gcc 不会替换系统 gcc的主要内容,如果未能解决你的问题,请参考以下文章

使用conda 对gcc进行升级 (sonicparanoid)

`conda build gcc-5` 在 Mac OS Mojave 上失败

gcc的替换,很有用

macbook中gcc替换为gnu gcc

带有 -isystem<include_path> 的 gcc -MDD 不会为“系统”路径添加依赖项

vmware workstation虚拟机中linux系统如何安装gcc