ubuntu16.04安装gcc5.4.0问题记录(实测)

参考博客:
https://blog.csdn.net/u011622208/article/details/102542268
https://blog.csdn.net/aBlueMouse/article/details/78145802
大体流程跟着上面走其实并没有问题,但关键就在于最初的时候,会冒出些问题
比如:
问题零
不同路径下编译,出现的问题不同,甚至有的时候在相同路径下编译,都会出现不同的问题,所以,当make不成功的时候,多试几次或者换个路径多试几次,我装了四五遍才成功装好,一把心酸泪。
问题一
c compiler not found
解决办法:
通过命令行安装一个gcc

sudo apt install gcc-8 g++-8

说来也奇怪,明明gcc5.4也是gcc,安装5.4之前却还需要安装一个gcc,应该是gcc5.4的环境依赖未配置好,所以需要提前安装一个其他版本的gcc配置环境。
安装完后

gcc -v

用该代码检查下gcc的版本,如果有版本信息输出就代表gcc安装成功,再去configure,就可以顺利通过啦
我在安装完gcc后,用gcc -v查询版本时,查询出来的版本还是之前那个已经被我删除的版本,再找了一个程序,进行测试时,报错,在网上查询更换gcc版本的教程,更换到新安装的gcc版本,就可以顺利编译通过了。
编译通过。
编译通过后,按照上面两篇博客里的教程,一步步走即可。
make时间较长,耐心一步步等待,中间有可能会报错如下
问题二

./md-unwind-support.h:65:48:  error:  dereferencing pointer to incomplete type 'struct ucontext'

   sc = (struct sigcontext *)(void *) &uc_->uc_mcontext);

解决方法为
大约65行左右的代码 struct ucontext * uc_ = context->cfa改成如下

 struct ucontext_t * uc_ = context->cfa//多了一个——t

再重新make,报错如下
问题三

libtool: link: ar rc .libs/libcilkrts.a  cilk-abi-vla.o os-unix-sysdep.o bug.o cilk-abi.o cilk-abi-cilk-for.o cilk-abi-vla-internal.o cilk_api.o cilk_fiber.o cilk_fiber-unix.o cilk_malloc.o c_reducers.o except-gcc.o frame_malloc.o full_frame.o global_state.o jmpbuf.o local_state.o metacall_impl.o os_mutex-unix.o os-unix.o pedigrees.o record-replay.o reducer_impl.o scheduler.o signal_node.o spin_mutex.o stats.o symbol_test.o sysdep-unix.o worker_mutex.o
libtool: link: ranlib .libs/libcilkrts.a
libtool: link: ( cd ".libs" && rm -f "libcilkrts.la" && ln -s "../libcilkrts.la" "libcilkrts.la" )
make[2]: Leaving directory '/home/ning/software/gcc-5.4.0/build/x86_64-unknown-linux-gnu/libcilkrts'
make[1]: Leaving directory '/home/ning/software/gcc-5.4.0/build'
Makefile:910: recipe for target 'all' failed
make: *** [all] Error 2

其实根本没有实际错误,但还是失败,所以,更换build路径试一试
更换路径后还是一样的问题
//所以在gcc5.4.0根目录下执行make,该问题解决
//将build和gcc放在同一级目录下,重新编译,问题解决
又重装了两次gcc发现,不需要更换目录,make编译停止后直接再次make就可以继续了,不需要更换build路径
问题四

../../.././libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc:237:22: error: aggregate 'sigaltstack handler_stack' has incomplete type and cannot be defined
   struct sigaltstack handler_stack;
                      ^
Makefile:449: recipe for target 'sanitizer_stoptheworld_linux_libcdep.lo' failed
make[4]: *** [sanitizer_stoptheworld_linux_libcdep.lo] Error 1
make[4]: Leaving directory '/home/ning/software/gcc-5.4.0/x86_64-unknown-linux-gnu/libsanitizer/sanitizer_common'
Makefile:437: recipe for target 'all-recursive' failed
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory '/home/ning/software/gcc-5.4.0/x86_64-unknown-linux-gnu/libsanitizer'
Makefile:307: recipe for target 'all' failed
make[2]: *** [all] Error 2
make[2]: Leaving directory '/home/ning/software/gcc-5.4.0/x86_64-unknown-linux-gnu/libsanitizer'
Makefile:16925: recipe for target 'all-target-libsanitizer' failed
make[1]: *** [all-target-libsanitizer] Error 2
make[1]: Leaving directory '/home/ning/software/gcc-5.4.0'
Makefile:910: recipe for target 'all' failed
make: *** [all] Error 2

参考网站https://reviews.llvm.org/D35246

将/sanitizer_stoptheworld_linux_libcdep.cc中第237行

struct sigaltstack handler_stack;

修改为

stack_t handler_stack;

重新编译,发现还是有几处问题,按照上面网址中的内容,全部修改即可。

问题五

../../.././libsanitizer/asan/asan_linux.cc: In function 'bool __asan::AsanInterceptsSignal(int)':
../../.././libsanitizer/asan/asan_linux.cc:222:20: error: 'SIGSEGV' was not declared in this scope
   return signum == SIGSEGV && common_flags()->handle_segv;
                    ^
Makefile:461: recipe for target 'asan_linux.lo' failed
make[4]: *** [asan_linux.lo] Error 1

参考网站https://bugs.busybox.net/show_bug.cgi?id=10061
在asan_linux.cc中添加头文件#include <signal.h>即可

问题六

…/…/…/…/libsanitizer/tsan/tsan_platform_linux.cc: In function ‘int __tsan::ExtractResolvFDs(void*, int*, int)’:
…/…/…/…/libsanitizer/tsan/tsan_platform_linux.cc:290:16: error: ‘statp’ was not declared in this scope
__res_state statp = (__res_state)state;
^~~~~
…/…/…/…/libsanitizer/tsan/tsan_platform_linux.cc:290:16: note: suggested alternative: ‘state’
__res_state statp = (__res_state)state;

将第一行代码修改为第二行即可

  __res_state *statp = (__res_state*)state;
  struct __res_state *statp = (struct __res_state*)state;

重新编译
就可以成功了

<think>嗯,用户想在Ubuntu 16.04安装GCC 9.4.0版本。首先,我需要回忆一下相关的安装步骤。根据之前看过的资料,Ubuntu 16.04默认的软件源可能不包含GCC 9.4.0,因为16.04比较旧了。通常,较新的软件包需要添加第三方仓库,比如Ubuntu Toolchain PPA。 记得用户提供的引用里提到,安装GCC 9.0的部分可以参考某个文章,可能涉及到添加PPA。比如引用[1]提到在Ubuntu 16.04安装GCC 9.4.0,参考了安装GCC9.0的部分。而PPA通常由Ubuntu Toolchain维护,所以可能需要添加ppa:ubuntu-toolchain-r/test这个仓库。 接下来,用户需要更新软件包列表,然后安装gcc-9和g++-9。安装完成后,可能需要使用update-alternatives来设置默认的GCC版本,特别是如果系统上已经存在其他版本的GCC的话。引用[2]中提到了使用update-alternatives来管理不同版本的GCC,比如切换gcc-9为默认版本。 另外,用户可能还需要安装依赖库,如TBB库,特别是如果使用并行算法的话,但这里用户的问题可能不需要,但安装GCC之后可能需要处理依赖问题。不过根据引用[4],安装build-essential包可以获取基本编译工具,但可能和特定版本的GCC无关。 离线安装的情况,引用[3]提到直接安装可能比仅下载更可靠,因为某些依赖包可能没被下载到。不过用户这里可能是在线安装,所以可以忽略这部分,但需要注意如果用户网络有问题,可能需要其他方法。 步骤大致应该是: 1. 添加PPA仓库 2. 更新软件源 3. 安装gcc-9和g++-9 4. 配置默认版本 5. 验证安装 需要确认这些步骤是否正确。另外,GCC 9.4.0是否在PPA中存在?因为PPA可能提供的是9.x的版本,但具体到9.4.0可能需要确认。可能需要用户安装gcc-9,然后自动获取最新补丁版本,比如9.4.0。但需要检查PPA中的可用版本。 另外,安装后可能需要手动符号链接,或者使用update-alternatives来切换版本。需要确保安装后的执行文件路径正确,比如/usr/bin/gcc-9。 最后,生成相关问题需要考虑用户可能的后续疑问,比如如何切换版本、安装其他组件或处理依赖问题。</think>### 分步指南:在Ubuntu 16.04安装GCC 9.4.0 #### 1. **添加Ubuntu Toolchain PPA** 由于Ubuntu 16.04官方源不包含GCC 9.4.0,需通过第三方仓库获取: ```bash sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt update ``` 该PPA提供了新版本编译工具链[^1][^4]。 #### 2. **安装GCC 9.4.0** 执行以下命令安装GCC和G++ 9版本: ```bash sudo apt install gcc-9 g++-9 ``` 系统会自动下载并安装GCC 9.4.0及相关依赖[^1]。 #### 3. **配置默认版本(可选)** 若需将GCC 9设为默认编译器,使用`update-alternatives`: ```bash sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 90 sudo update-alternatives --config gcc # 手动选择版本 ``` 此操作支持多版本共存[^2]。 #### 4. **验证安装** 检查版本号: ```bash gcc --version # 输出应包含9.4.0 g++ --version ``` #### 5. **安装依赖库(如需并行计算)** 若需使用C++17并行算法库,需额外安装Intel TBB: ```bash sudo apt install libtbb-dev ``` 参考Intel TBB官方文档进行配置。 --- ### 注意事项 - **依赖问题**:若安装失败,建议直接联网安装而非离线下载,避免依赖缺失[^3]。 - **旧版本共存**:Ubuntu 16.04默认GCC5.4.0,可通过`update-alternatives`切换版本[^2]。 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值