报错:
/usr/bin/ld: /tmp/ccyKBF8m.o: undefined reference to symbol 'pthread_setaffinity_np@@GLIBC_2.3.4' /lib/x86_64-linux-gnu/libpthread.so.0: 无法添加符号: DSO missing from command line collect2: error: ld returned 1 exit status Makefile:12: recipe for target 'graph500_reference_bfs_sssp' failed make: *** [graph500_reference_bfs_sssp] Error 1
1、尝试
最近在搞mpi相关的程序,发现在编译相关程序时,出现上述问题,debug了一下午,也试了各种操作,但都没有解决。
以下为我尝试的方法:
#1、在链接器最后加-lpthread
LDFLAGS= -lpthread
#2、使用locate指令确认动态链接库的位置,使用—L /path/to/缺少的动态链接库的文件
LDFLAGS = -L/path/to/pthread/library -lpthread
但很可惜,都没有解决问题。
2、深究
我要跑的程序需要MPI3.0的标准,我以为是某个库的版本,经过查阅发现,MPI 3.0 是一个标准,而不是单个库的版本。要使用 MPI 3.0 标准的功能,想安装支持 MPI 3.0 标准的 MPI 库,需要从相应的 MPI 实现提供商处获取适当的软件包,并按照其提供的安装说明进行安装。常见的 MPI 实现包括 Open MPI、MPICH 和 Intel MPI。
3、解决
我首先在ubuntu18.04上安装的是mpich-3.4.3,情况可想而知,一直有这个错误,所以,最终通过卸载mpich,安装了openmpi解决了问题,真的栓Q。
#openmpi可以直接使用apt命令进行安装
sudo apt-get install openmpi
4、问题解决过程中遇到的问题
#由于我是通过源码编译安装的mpich,导致无法使用apt remove指令卸载。
#在使用源码编译安装软件的过程中,最好不要删除原有的安装包,在自己想要卸载的时候,可以在源安装包内使用相关命令进行删除和卸载,大多数是支持下面指令的。
sudo make uninstall && make clean
5、记录一下源码编译安装库的过程
大致可以分为以下几个过程吧,以安装mpich的过程为例。
1、下载&&解压
#wget下载源文件 wget https://www.mpich.org/static/downloads/3.4/mpich-3.4.3.tar.gz #解压 tar -zxvf mpich-3.4.3.tar.gz
2、配置安装路径
如果不指定安装路径:
可执行文件默认放在/usr/local/bin,库文件默认放在/usr/local/lib,
配置文件默认放在/usr/local/etc,
其他的资源文件放在/usr/local/share,比较分散。
为了便于集中管理某个软件的各种文件,想指定到某个路径下,可以配置 --prefix
./configure --prefix=/usr/local/mpich
3、编译安装
#如果想编译的快些,可以使用make -j4或者make -j8 多核进行编译。 make #最后执行安装命令。 make install
4、配置环境变量
通过vim打开当前用户下所对应的.bashrc文件:
sudo vim ~/.bashrc
在最下面一行添加:
export PATH=/usr/local/mpich/bin:$PATH
然后再保存退出后,再更新配置文件使其生效。
source ~/.bashrc
完成搞定。