无法链接libopenblas.so.0 DLL:无sudo权限下C++依赖配置求助
无sudo权限下Red Hat系统配置OpenBLAS+Armadillo+libpca的链接问题解决方案
我来帮你一步步搞定这个依赖配置和链接的问题,咱们从已安装的OpenBLAS开始排查,再依次处理Armadillo、libpca,最后搞定自己代码的编译运行:
第一步:先确认OpenBLAS的安装状态
你已经把OpenBLAS编译安装到/my/dir/program/了,先检查下安装文件是否到位:
- 进入
/my/dir/program/lib/,看看有没有libopenblas.so.0、libopenblas.so(软链接)、libopenblas.a这些文件 - 再去
/my/dir/program/include/确认下,有没有cblas.h、openblas_config.h这类头文件
要是这些文件都齐全,说明OpenBLAS安装没问题,接下来处理Armadillo。
第二步:编译安装Armadillo
Armadillo需要明确知道OpenBLAS的位置,而且咱们没sudo权限,得手动配置:
- 先把Armadillo的包解压到
/my/dir/下,进入解压后的目录 - 复制并自定义配置文件(因为默认配置是给系统安装用的):
cp ./include/armadillo_bits/config.hpp.in ./include/armadillo_bits/config.hpp - 编辑这个
config.hpp文件,找到以下内容并修改:- 取消注释
#define ARMA_USE_OPENBLAS(开启OpenBLAS支持) - 取消注释
#define ARMA_USE_LAPACK(开启LAPACK支持,注意OpenBLAS已经包含了LAPACK的实现,不用单独装)
- 取消注释
- 用cmake指定安装路径和依赖,然后编译安装:
先试试自动检测:
如果cmake没检测到OpenBLAS,就手动指定路径:cmake -DCMAKE_INSTALL_PREFIX=/my/dir/program/ . make make install
这样就能把Armadillo装到cmake -DCMAKE_INSTALL_PREFIX=/my/dir/program/ \ -DOpenBLAS_INCLUDE_DIR=/my/dir/program/include \ -DOpenBLAS_LIBRARY=/my/dir/program/lib/libopenblas.so . make make install/my/dir/program/里了。
第三步:编译安装libpca
libpca依赖Armadillo,所以编译时得指定Armadillo的路径:
- 把libpca解压到
/my/dir/,进入目录 - 同样用cmake指定安装路径和依赖:
如果编译时还提示找不到OpenBLAS,就把OpenBLAS的路径也加上:cmake -DCMAKE_INSTALL_PREFIX=/my/dir/program/ \ -DArmadillo_INCLUDE_DIR=/my/dir/program/include \ -DArmadillo_LIBRARY=/my/dir/program/lib/libarmadillo.so . make make installcmake -DCMAKE_INSTALL_PREFIX=/my/dir/program/ \ -DArmadillo_INCLUDE_DIR=/my/dir/program/include \ -DArmadillo_LIBRARY=/my/dir/program/lib/libarmadillo.so \ -DOpenBLAS_INCLUDE_DIR=/my/dir/program/include \ -DOpenBLAS_LIBRARY=/my/dir/program/lib/libopenblas.so . make make install
第四步:编译你自己的代码
假设你的代码文件是test_pca.cpp,编译时要指定头文件路径和所有依赖的库,注意库的顺序(依赖关系靠后的库要放在后面):
g++ test_pca.cpp -o test_pca \ -I/my/dir/program/include \ -L/my/dir/program/lib \ -lpca -larmadillo -lopenblas -llapack
-I用来指定头文件的搜索路径,包含Armadillo、libpca、OpenBLAS的头文件-L指定库文件的搜索路径-lpca链接libpca库,-larmadillo链接Armadillo,-lopenblas和-llapack链接线性代数库
第五步:解决运行时动态库加载问题
因为系统默认不会去/my/dir/program/lib/找动态库,所以运行时会提示找不到libopenblas.so.0,可以通过设置环境变量解决:
export LD_LIBRARY_PATH=/my/dir/program/lib:$LD_LIBRARY_PATH ./test_pca
要是想每次登录都自动生效,把这个export命令加到你的~/.bashrc或者~/.bash_profile里就行。
常见问题排查
- 如果cmake检测不到依赖,别纠结自动检测,直接手动指定
*_INCLUDE_DIR和*_LIBRARY最稳妥 - 编译时库的顺序很关键,比如你的代码依赖libpca,libpca依赖Armadillo,Armadillo依赖OpenBLAS,所以顺序要按
-lpca -larmadillo -lopenblas -llapack来,不然会出现undefined reference错误 - 所有安装步骤都要指定
PREFIX=/my/dir/program/,避免往系统目录安装(咱们没sudo权限也装不了) - 要是出现链接错误,先检查库文件是否存在,路径有没有写错
内容的提问来源于stack exchange,提问作者user3813057
相关产品推荐
相关产品推荐

