首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安装了g++ /conda-forge,无法编译hello world

安装了g++ /conda-forge,无法编译hello world
EN

Stack Overflow用户
提问于 2021-08-03 22:33:28
回答 1查看 2.9K关注 0票数 1

这与配置错误有关,但这是一台全新的电脑,完全是通过迷你/conda锻造安装的,所以它应该能工作。

我的迷你配置非常简单:conda-forge是除默认值(~/.condarc)之外的唯一通道:

代码语言:javascript
复制
changeps1: false
channels:
  - conda-forge
  - defaults

它是最新的(conda update --all)。

GNU、C++和Fortran编译器已经通过后置5.0编译器环境安装。以下是conda list linux的清单

代码语言:javascript
复制
# packages in environment at /home/jpivarski/miniconda3:
#
# Name                    Version                   Build  Channel
binutils_impl_linux-64    2.36.1               h193b22a_2    conda-forge
binutils_linux-64         2.36                hf3e587d_33    conda-forge
gcc_impl_linux-64         9.3.0               h6df7d76_17  
gcc_linux-64              9.3.0               hf25ea35_33    conda-forge
gfortran_impl_linux-64    9.3.0               hc4a2995_19    conda-forge
gfortran_linux-64         9.3.0               hdc58fab_33    conda-forge
gxx_impl_linux-64         9.3.0               hbdd7822_17  
gxx_linux-64              9.3.0               h3fbe746_33    conda-forge
kernel-headers_linux-64   2.6.32              he073ed8_14    conda-forge
ld_impl_linux-64          2.36.1               hea4e1c9_2    conda-forge
libgcc-devel_linux-64     9.3.0               hb95220a_17  
libstdcxx-devel_linux-64  9.3.0               hf0c5c8d_17  
sysroot_linux-64          2.12                he073ed8_14    conda-forge

conda list compiler

代码语言:javascript
复制
# packages in environment at /home/jpivarski/miniconda3:
#
# Name                    Version                   Build  Channel
c-compiler                1.2.0                h7f98852_0    conda-forge
compilers                 1.2.0                ha770c72_0    conda-forge
cxx-compiler              1.2.0                h4bd325d_0    conda-forge
fortran-compiler          1.2.0                h1990efc_0    conda-forge

conda list binutil

代码语言:javascript
复制
# packages in environment at /home/jpivarski/miniconda3:
#
# Name                    Version                   Build  Channel
binutils                  2.36.1               hdd6e379_2    conda-forge
binutils_impl_linux-64    2.36.1               h193b22a_2    conda-forge
binutils_linux-64         2.36                hf3e587d_33    conda-forge

这是一个Debian系统,它附带了一个名为gcc-8-base的包,

代码语言:javascript
复制
gcc-8-base/stable,now 8.3.0-6 amd64 [installed]

但是这个包没有在路径中添加一个gcc命令,所以它是用户不可见的。此Debian位于Chromebook (/proc/version)上的Crostini中:

代码语言:javascript
复制
Linux version 5.4.119-14943-gff839c7fedcc (chrome-bot@chromeos-ci-legacy-us-east1-d-x32-83-pa8b) (Chromium OS 12.0_pre422132_p20210405-r4 clang version 13.0.0 (/var/tmp/portage/sys-devel/llvm-12.0_pre422132_p20210405-r4/work/llvm-12.0_pre422132_p20210405/clang cd442157cff4aad209ae532cbf031abbe10bc1df)) #1 SMP PREEMPT Wed Jul 28 21:06:01 PDT 2021

现在有趣的是。下面是最简单的C++程序:

代码语言:javascript
复制
// #include <iostream>

int main(int argc, char** argv) {
  int x = 2 + 4;
  // std::cout << "hello world" << std::endl;
  return 0;
}

(是的,当“你好世界”不起作用时,我对它进行了评论。)

用下列任何一种方法编译它:

代码语言:javascript
复制
g++ tmp.cpp
g++ -std=c++11 tmp.cpp
g++ -std=c++11 -lstdc++ tmp.cpp

收益率

代码语言:javascript
复制
/home/jpivarski/miniconda3/bin/../lib/gcc/x86_64-conda-linux-gnu/9.3.0/../../../../x86_64-conda-linux-gnu/bin/ld: /home/jpivarski/miniconda3/bin/../lib/gcc/x86_64-conda-linux-gnu/9.3.0/../../../../x86_64-conda-linux-gnu/lib/../lib/libstdc++.so: undefined reference to `aligned_alloc@GLIBC_2.16'
/home/jpivarski/miniconda3/bin/../lib/gcc/x86_64-conda-linux-gnu/9.3.0/../../../../x86_64-conda-linux-gnu/bin/ld: /home/jpivarski/miniconda3/bin/../lib/gcc/x86_64-conda-linux-gnu/9.3.0/../../../../x86_64-conda-linux-gnu/lib/../lib/libstdc++.so: undefined reference to `clock_gettime@GLIBC_2.17'
collect2: error: ld returned 1 exit status

顺便说一句,对于ldd /that/long/path/to/libstdc++.so

代码语言:javascript
复制
./../../x86_64-conda-linux-gnu/lib/../lib/libstdc++.so
        linux-vdso.so.1 (0x00007ffd2e8d1000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ef64da8e000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ef64d8cd000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ef64dd92000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ef64d8b3000)

什么都没有“找不到”。

我可以使用gcc编译上面的程序(注释为"hello world")。

代码语言:javascript
复制
gcc -std=c++11 tmp.cpp

但是,如果我把#include <iostream>std::cout放回去,编译器的错误是:

代码语言:javascript
复制
/home/jpivarski/miniconda3/bin/../lib/gcc/x86_64-conda-linux-gnu/9.3.0/../../../../x86_64-conda-linux-gnu/bin/ld: /tmp/cc8BE1Tc.o: warning: relocation against `_ZSt4cout' in read-only section `.text'
/home/jpivarski/miniconda3/bin/../lib/gcc/x86_64-conda-linux-gnu/9.3.0/../../../../x86_64-conda-linux-gnu/bin/ld: /tmp/cc8BE1Tc.o: in function `main':
tmp.cpp:(.text+0x20): undefined reference to `std::cout'
/home/jpivarski/miniconda3/bin/../lib/gcc/x86_64-conda-linux-gnu/9.3.0/../../../../x86_64-conda-linux-gnu/bin/ld: tmp.cpp:(.text+0x25): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/home/jpivarski/miniconda3/bin/../lib/gcc/x86_64-conda-linux-gnu/9.3.0/../../../../x86_64-conda-linux-gnu/bin/ld: tmp.cpp:(.text+0x2f): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
/home/jpivarski/miniconda3/bin/../lib/gcc/x86_64-conda-linux-gnu/9.3.0/../../../../x86_64-conda-linux-gnu/bin/ld: tmp.cpp:(.text+0x3a): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
/home/jpivarski/miniconda3/bin/../lib/gcc/x86_64-conda-linux-gnu/9.3.0/../../../../x86_64-conda-linux-gnu/bin/ld: /tmp/cc8BE1Tc.o: in function `__static_initialization_and_destruction_0(int, int)':
tmp.cpp:(.text+0x6a): undefined reference to `std::ios_base::Init::Init()'
/home/jpivarski/miniconda3/bin/../lib/gcc/x86_64-conda-linux-gnu/9.3.0/../../../../x86_64-conda-linux-gnu/bin/ld: tmp.cpp:(.text+0x7f): undefined reference to `std::ios_base::Init::~Init()'
/home/jpivarski/miniconda3/bin/../lib/gcc/x86_64-conda-linux-gnu/9.3.0/../../../../x86_64-conda-linux-gnu/bin/ld: warning: creating DT_TEXTREL in a PIE
collect2: error: ld returned 1 exit status

它怎么会被如此错误的配置,以及如何修复它?这是一个全新的装置。还没发生什么奇怪的事。如果这应该是一个错误报告给康达锻造,我不知道把它张贴在哪里。

EN

回答 1

Stack Overflow用户

发布于 2021-08-04 00:45:40

回答:--我从头开始安装它,这一次起作用了。

由于我不能同时尝试这两种方法(这是在一台磁盘空间有限的Chromebook上,所以这不是一种选择),所以我只能根据这次的不同来推测原因:

  1. 我将所有的低级gcc_linux-64gxx_linux-64等和高级compilersc-compilercxx-compiler安装在一个单独的"conda install“命令中,而不是单独的命令中。
  2. 我将channel_priority: strict添加到~/.condarc配置中。

我没有使用高级compilers包(并让它将gcc_linux-64gxx_linux-64等作为依赖项)的唯一原因是因为我不知道它。在我的第一次安装尝试中,我安装了gcc_linux-64gxx_linux-64,它们将它们添加为可通过CCCXX环境变量访问的可执行文件,而不是在路径上添加为gccg++。然后,当我意识到compilers包是针对面向用户的gccg++ (通过c-compilercxx-compiler)时,我随后安装了它。由于conda install应该使所有这些包彼此一致(特别是在conda update --all之后),所以它们之间的依赖关系有可能是一个破碎的假设。这是第一种猜测。

第二次尝试也不同,因为我在我在康达锻造上找到的指示之后添加了我在康达锻造上找到的指示。显然,严格优先级的论点是如此强烈,以至于它将成为Conda5.0中的缺省值。也许是我第一次尝试混合锻造和违约?(如果是这样的话,我不知道为什么我以前从来没有遇到过这个问题--严格的优先级对我来说是新的,尽管我只使用过两个渠道。)这是第二种猜测,我相信这比猜测1更强烈。

为了完整起见,我还使用曼巴进行了第二次尝试,而不是使用conda (有限的CPU功率;没有时间等待),尽管我不认为这会有什么不同。如果是的话,这对康达和曼巴来说都是坏消息。

我把这个问答组合留给后人,以防其他人遇到这样的问题。(如果您这样做了,您可能可以添加数据来解决上面的歧义。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68643464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档