Linux-Conda环境安装指定版本GCC 编译phylocom-4.2 Debug记录

简介: 本文记录了在Linux上编译phylocom-4.2过程中处理一系列异常的 Debug过程,希望可以为在Conda环境中遇到类似GCC问题的小伙伴提供一些参考。

软件背景

PHYLOCOM 是一个用于处理生态和谱系数据的软件,用命令行控制,可以计算多种谱系或群落结构及表型数据,测定性状的保守性及性状间的关联性。软件从github上下载源码压缩包 Source code (zip)到集群目录后,按照软件说明文件,解压后使用make命令编译源文件应该是能够正常使用的。
检查当前系统默认的gcc版本信息如下

$which gcc
/share/app/gcc-7.4.0/bin/gcc ### 系统管理员安装的gcc软件位置
$gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/share/app/gcc-7.4.0/libexec/gcc/x86_64-pc-linux-gnu/7.4.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../configure --prefix=/share/app/gcc-7.4.0
Thread model: posix
gcc version 7.4.0 (GCC)

1、首次编译尝试

当前系统默认使用的是集群管理员安装的4.8.5 版本的gcc 编译器。在该编译环境下,尝试对PHYLOCOM的源码进行编译出现$\color {red} {\small 异常}$:库文件缺失
这个异常其实只需要重新下载缺失的库文件" libmpc.so.2",安装更新链接其实就能够解决。但是问题是集群不是自己管理的,自己作为普通用户对管理员安装的软件只有使用权限,不能通过yum命令管理系统上的包。

$make
gcc -Wall -g -O1    -c -o main.o main.c
/share/app/gcc-7.4.0/libexec/gcc/x86_64-pc-linux-gnu/7.4.0/cc1: error while loading shared libraries: libmpc.so.2: cannot open shared object file: No such file or directory
make: *** [main.o] Error 1

$\color {red} {\large\small {总体解决方案}}$:既然自己只有管理自己创建的目录的权限,所以如果要快捷创建指定版本的GUN编译环境,可以选择在自己的Annaconda环境里进行部署。 推荐使用Conda Forge编译器包或其子包 cxx-compiler来为自己的子环境系统获取 C++ 编译器,cxx-compiler的一个优势是它可以跨平台工作,它可以识别为不同的系统并安装配套的的C++编译器,cxx-compiler 将在 Linux 上安装 g++,在 OSX 上安装 clang++,在 Windows 上安装 vc。

2、新建conda环境并安装cxx-compiler

在conda中新建一个新的环境CC_base来安装GUN编译器套件,安装最新版的cxx-compiler配置最新的C编译软件

$conda create -n CC_base -y
$conda activate CC_base
$conda install  -c conda-forge cxx-compiler

$which gcc
/***/Minconda/envs/CC_base/bin/gcc
$gcc -v ### conda环境内安装了 10.3.0 版本的gcc
Reading specs from /***/Minconda/envs/CC_base/bin/../lib/gcc/x86_64-conda-linux-gnu/10.3.0/specs
could not find specs file conda.specs
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/***/Minconda/envs/CC_base/bin/../libexec/gcc/x86_64-conda-linux-gnu/10.3.0/lto-wrapper
Target: x86_64-conda-linux-gnu
Configured with: ../configure --prefix=/home/conda/feedstock_root/build_artifacts/gcc_compilers_1650668905383/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho --with-slibdir=/home/conda/feedstock_root/build_artifacts/gcc_compilers_1650668905383/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho/lib --libdir=/home/conda/feedstock_root/build_artifacts/gcc_compilers_1650668905383/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho/lib --mandir=/home/conda/feedstock_root/build_artifacts/gcc_compilers_1650668905383/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho/man --build=x86_64-conda-linux-gnu --host=x86_64-conda-linux-gnu --target=x86_64-conda-linux-gnu --enable-default-pie --enable-languages=c,c++,fortran,objc,obj-c++ --enable-__cxa_atexit --disable-libmudflap --enable-libgomp --disable-libssp --enable-libquadmath --enable-libquadmath-support --enable-libsanitizer --enable-lto --enable-threads=posix --enable-target-optspace --enable-plugin --enable-gold --disable-nls --disable-bootstrap --disable-multilib --enable-long-long --with-sysroot=/home/conda/feedstock_root/build_artifacts/gcc_compilers_1650668905383/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho/x86_64-conda-linux-gnu/sysroot --with-build-sysroot=/home/conda/feedstock_root/build_artifacts/gcc_compilers_1650668905383/_build_env/x86_64-conda-linux-gnu/sysroot --with-gxx-include-dir=/home/conda/feedstock_root/build_artifacts/gcc_compilers_1650668905383/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho/x86_64-conda-linux-gnu/include/c++/10.3.0 --with-pkgversion='conda-forge gcc 10.3.0-16' --with-bugurl=https://github.com/conda-forge/ctng-compilers-feedstock/issues/new/choose
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 10.3.0 (conda-forge gcc 10.3.0-16)

3、尝试使用GCC 10编译--异常

安装完成后,再次进入PHYLOCOM的源码文件目录,尝试编译,结果再次遇到错误:
$\color {red}{\small {错误意思}}$是函数声明的头文件phylocom.h的很多全局变量出现了多重定义

/***/Minconda/envs/CC_base/bin/../lib/gcc/x86_64-conda-linux-gnu/10.3.0/../../../../x86_64-conda-linux-gnu/bin/ld: 
comtrait.o:~/test/phylocom-4.2/src/phylocom.h:230: 
multiple definition of `SWAPMETHOD'; 
main.o:~/test/phylocom-4.2/src/phylocom.h:230: : first defined here

编译报错的源码:

认证查阅了一些资料后,认识到原来是新安装的编译器的版本问题,这篇GCC更新说明文档 Porting to GCC 10 - GNU Project 提示说GCC 10 发行版在许多方面与以前的 GCC 发行版不同,其中一些旧行为已被有意更改以支持新标准,所以用 GCC 10 编译的时候可能会导致问题。导致异常的是GCC 10默认使用 -fno-common代替之前的-fno-plt参数(目前来说,这个参数具体作用还不知道,没学过C语言),现在GCC 10 中要求头文件声明全局变量的时候务必添加extern关键字,类似extern int y;这样进行声明。 所以,解决办法这个错误的办法要么就是修改头文件phylocom.h,给这些出现多重定义的变量添加上extern关键字,要么使用旧版本的GCC编译器。我选择后者,直接安装低一级版本的GCC 9来尝试解决错误。
所以在当前环境下用conda重新安装1.2.0 版本的cxx-compiler,这个这个版的cxx-compiler包含了GCC 9。

conda install  -c conda-forge cxx-compiler=1.2.0 -y

$\downarrow \downarrow \downarrow$ 安装完成GCC 版本信息

$gcc -v
Reading specs from /***/Minconda/envs/CC_base-9.4.0/bin/../lib/gcc/x86_64-conda-linux-gnu/9.4.0/specs
could not find specs file conda.specs
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/***/Minconda/envs/CC_base-9.4.0/bin/../libexec/gcc/x86_64-conda-linux-gnu/9.4.0/lto-wrapper
Target: x86_64-conda-linux-gnu
Configured with: ../configure --prefix=/home/conda/feedstock_root/build_artifacts/gcc_compilers_1650668900000/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho --with-slibdir=/home/conda/feedstock_root/build_artifacts/gcc_compilers_1650668900000/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho/lib --libdir=/home/conda/feedstock_root/build_artifacts/gcc_compilers_1650668900000/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho/lib --mandir=/home/conda/feedstock_root/build_artifacts/gcc_compilers_1650668900000/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho/man --build=x86_64-conda-linux-gnu --host=x86_64-conda-linux-gnu --target=x86_64-conda-linux-gnu --enable-default-pie --enable-languages=c,c++,fortran,objc,obj-c++ --enable-__cxa_atexit --disable-libmudflap --enable-libgomp --disable-libssp --enable-libquadmath --enable-libquadmath-support --enable-libsanitizer --enable-lto --enable-threads=posix --enable-target-optspace --enable-plugin --enable-gold --disable-nls --disable-bootstrap --disable-multilib --enable-long-long --with-sysroot=/home/conda/feedstock_root/build_artifacts/gcc_compilers_1650668900000/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho/x86_64-conda-linux-gnu/sysroot --with-build-sysroot=/home/conda/feedstock_root/build_artifacts/gcc_compilers_1650668900000/_build_env/x86_64-conda-linux-gnu/sysroot --with-gxx-include-dir=/home/conda/feedstock_root/build_artifacts/gcc_compilers_1650668900000/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho/x86_64-conda-linux-gnu/include/c++/9.4.0 --with-pkgversion='conda-forge gcc 9.4.0-16' --with-bugurl=https://github.com/conda-forge/ctng-compilers-feedstock/issues/new/choose
Thread model: posix
gcc version 9.4.0 (conda-forge gcc 9.4.0-16)

4、降级到GCC 9.4.0编译-- SUCCESS!!

一开始可能是由于conda环境中GCC高级版本回退到低级版本的过程中部分gcc库没有成功回退,导致共享库libgcc_s.so缺失 引发GCC 9.4.0编译异常

/***/Minconda/envs/CC_base/bin/../lib/gcc/x86_64-conda-linux-gnu/9.4.0/../../../../x86_64-conda-linux-gnu/bin/ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status
make: *** [phylocom] Error 1

幸好这个问题可以通过conda安装conda-forge 发布的libgcc 进行修补,具体需要注意libgcc的版本要与当前GCC 版本适配,这里选择安装5.2.0版的libgcc。

$conda search  libgcc
Loading channels: done
# Name                       Version           Build  Channel             
libgcc                         4.8.4               1  conda-forge         
libgcc                         4.8.4               1  anaconda/pkgs/free  
libgcc                         4.8.4               1  anaconda/pkgs/free  
libgcc                         4.8.5               1  anaconda/pkgs/free  
libgcc                         4.8.5               1  anaconda/pkgs/free  
libgcc                         4.8.5               2  conda-forge         
libgcc                         4.8.5               2  anaconda/pkgs/free  
libgcc                         4.8.5               2  anaconda/pkgs/free  
libgcc                         5.2.0               0  conda-forge         
libgcc                         5.2.0               0  anaconda/pkgs/free  
libgcc                         5.2.0               0  anaconda/pkgs/free  
libgcc                         7.2.0      h69d50b8_2  conda-forge         
libgcc                         7.2.0      h69d50b8_2  pkgs/main    

$conda install -c conda-forge libgcc=5.2.0 -y ## 安装libgcc

终于,在通过上面一顿操作后,在我的目录下成功编译了phylocom 这个软件

最后,可以把软件路径添加到自己自己HOME目录下的用户配置文件的内的PATH变量以方便调用:
echo "export PATH=\"${PWD}:\"\${PATH}" >> ~/.bashrc


总结,这次的软件编译安装过程,促使自己学会了在conda子环境下配置自己的GUN编译器,如果缺少C语言库的话,也能通过conda命令进行快捷安装,从而适应不同情况的软件编译安装需求。

目录
相关文章
|
12天前
|
Web App开发 搜索推荐 Unix
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
【10月更文挑战第21天】Linux系统之MobaXterm远程连接centos的GNOME桌面环境
108 4
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
|
10天前
|
消息中间件 Linux RocketMQ
在Red Hat Enterprise Linux 9上使用Docker快速安装并部署
通过以上步骤,你可以在Red Hat Enterprise Linux 9上使用Docker快速安装并部署RocketMQ。这种方法不仅简化了安装过程,还提供了一个灵活的环境来管理和扩展消息队列系统。RocketMQ作为一款高性能的分布式消息系统,通过Docker可以实现快速部署和高效管理。
33 2
|
11天前
|
消息中间件 Linux RocketMQ
在Red Hat Enterprise Linux 9上使用Docker快速安装并部署
通过以上步骤,你可以在Red Hat Enterprise Linux 9上使用Docker快速安装并部署RocketMQ。这种方法不仅简化了安装过程,还提供了一个灵活的环境来管理和扩展消息队列系统。RocketMQ作为一款高性能的分布式消息系统,通过Docker可以实现快速部署和高效管理。
24 3
|
9天前
|
Linux UED iOS开发
|
6天前
|
Linux
Linux - 如何编译源码安装软件
源码编译安装通常包括三个步骤:1) `./configure` 检测平台特征和依赖项,生成 Makefile;2) `make` 编译源码,生成可执行文件;3) `make install` 将可执行文件安装到指定目录并配置环境变量。
22 0
|
13天前
|
Linux 网络安全 虚拟化
适用于Linux的Windows子系统(WSL1)的安装与使用记录
并放到启动文件夹,就可以开机自动启动了。
17 0
|
安全 Linux 测试技术
配置Goby工具环境(win,linux,macOS)
配置Goby工具环境(win,linux,macOS)
785 2
|
15天前
|
运维 安全 Linux
Linux中传输文件文件夹的10个scp命令
【10月更文挑战第18天】本文详细介绍了10种利用scp命令在Linux系统中进行文件传输的方法,涵盖基础文件传输、使用密钥认证、复制整个目录、从远程主机复制文件、同时传输多个文件和目录、保持文件权限、跨多台远程主机传输、指定端口及显示传输进度等场景,旨在帮助用户在不同情况下高效安全地完成文件传输任务。
111 5