c - 使用 Makefile 编译 MKL、OpenBLAS 和其他库
问题描述
我尝试编译了一个发布在github上的概率模型(https://github.com/gerowam/influence),但是对于不熟悉C语言和编译的人来说,如何安装相关库真的很难并在 ubuntu 20.04 上使用“Makefile”进行编译。
以下是我根据github网页上编译过程的简短介绍安装所需库的操作:
sudo apt-get update
sudo apt-get install git
sudo apt-get install make
sudo apt-get install gcc
sudo apt-get install g++
sudo apt-get install libmkl-dev
sudo apt-get install libopenblas-dev
sudo apt-get install libhdf5-dev
sudo apt-get install liblapack-dev
sudo git clone http://www.github.com/gerowam/influence
当我运行“make”时,我得到了以下信息:
swhan@swhan-VirtualBox:~/influence/dtm-dim-rdim/rdim$ make
g++ -w -Wunsafe-loop-optimizations -DSPARSE -DMKL -O3 -DMKL_ILP64 -DNDEBUG -DHAVE_INLINE -DGSL_RANGE_CHECK_OFF -I ../lib/include -I ../lib -I ../lib/math -I ../gslwrap/include -I ../gslwrap/include/gslwrap -I ../local/include -I ../lib/util/gflags-1.1/src/gflags -I/include -I /include -I /include -m64 -fopenmp -frounding-math -msse4.2 -mfpmath=sse -march=native -fno-trapping-math -fno-signaling-nans -fno-signed-zeros -fgcse-after-reload -funsafe-loop-optimizations -fgcse-sm -fgcse-las -fipa-pta -funswitch-loops -c -o ss-lm.o ss-lm.c
In file included from ss-lm.h:29,
from ss-lm.c:15:
data.h:41:10: fatal error: mkl_lapacke.h: No such file or directory
41 | #include "mkl_lapacke.h"
| ^~~~~~~~~~~~~~~
compilation terminated.
make: *** [<builtin>: ss-lm.o] Error 1
所以我查看了 Makefile,它看起来像这样:
CFLAGS = -DSPARSE -DMKL -O3 -DMKL_ILP64 \
-DNDEBUG -DHAVE_INLINE -DGSL_RANGE_CHECK_OFF \
-I ${SPARSE_GSL_INC} -I ${LIB} -I ${LIB}/math -I ${GSLWRAP_LIB}/include \
-I ${GSLWRAP_LIB}/include/gslwrap -I ${LOCAL_DIR}/include \
-I ${LIB}/util/gflags-1.1/src/gflags -I${LOCAL}/include \
-I ${OPENBLAS_ROOT}/include \
-I ${MKLROOT}/include \
-m64 -fopenmp -frounding-math -msse4.2 -mfpmath=sse -march=native \
-fno-trapping-math -fno-signaling-nans -fno-signed-zeros \
-fgcse-after-reload -funsafe-loop-optimizations \
-fgcse-sm -fgcse-las -fipa-pta -funswitch-loops
#-I ../opt-local/openblas/include \
#-fprofile-use -fprofile-correction
#-fprofile-correction -fprofile-generate -fprofile-arcs -fprofile-values
但是在 Makefile 中,“MKLROOT”和“OPENBLAS_ROOT”不存在宏,但是当我尝试为两者设置宏时,出现了问题。具体来说,似乎 MKL 库安装在 /usr/include/mkl 的路径中,但是
-I ${MKLROOT}/include
以上让我对如何为 MKL 设置宏感到困惑。另外,如果我设置以下内容:
MKLROOT=/usr
...
-I ${MKLROOT}/include/mkl
又一个问题出现了。那是,
LDFLAGS = -Wl,-Map=ld_linkmap,-cref,-rpath -Wl,${LIB}/lib -L${LIB}/lib \
-L${LOCAL_DIR}/lib -L${LOCAL_DIR}/lib/stl \
-L../opt-local/openblas/lib -L/usr/lib/x86_64-linux-gnu/hdf5/serial \
-lhdf5 -lhdf5_hl -lgsl -lopenblas -lm \
-Wl,--no-as-needed -L${MKLROOT}/lib/intel64 -lmkl_intel_ilp64 -lmkl_core -lmkl_gnu_thread -lgomp -ldl -lpthread
在这种情况下,与“intel64”相关的东西似乎位于 /usr/include/mkl/intel64 但我不知道如何执行上述命令。以下是我收到的错误消息:
/usr/bin/ld: main.o: in function `main':
main.c:(.text.startup+0x156): undefined reference to `MKL_Set_Interface_Layer'
/usr/bin/ld: main.c:(.text.startup+0x15d): undefined reference to `MKL_Set_Threading_Layer'
collect2: error: ld returned 1 exit status
make: *** [Makefile:55: main] Error 1
解决方案
由于您的 MKL 库安装在 /usr/include/mkl 位置,您可以将 MKLROOT 环境变量设置为export MKLROOT=/usr/include/mkl
另一种替代方法是,安装 oneAPI Base & HPC Toolkits 从中您可以获取英特尔 MKL 库包并初始化 oneAPI 环境,该环境会自动设置MKL 根。有关 oneAPI Base Toolkit 和 oneAPI HPC Toolkit 的更多详细信息,请参阅https://software.intel.com/content/www/us/en/develop/articles/installation-guide-for-intel-oneapi-toolkits.html
请参阅以下有关英特尔 oneMKL 的链接 https://software.intel.com/content/www/us/en/develop/documentation/onemkl-linux-developer-guide/top/getting-started/setting-environment-variables/脚本设置环境变量.html
推荐阅读
- python - 是否可以使用 python 截取网站的屏幕截图而不必在我的电脑上实际打开网站?
- wordpress - 如何在 WooCommerce 的自定义下拉列表中添加“按产品标签按字母顺序排序”?
- r - R中带有“ldpy”的多重线性回归问题
- angular - 我们如何在 Angular 前端进行密码确认?
- mongodb - 如何为 MongoDB 设置 Ec2,以便 RAM 和存储根据他们的需求自动增加?
- javascript - 如何使用javascript增量方法增加数据库中的计数?
- java - Android Java、FileProviders、getUriFromFile 失败并出现错误无法找到包含 /storage/1018-2710/Pictures/Sarx7IIJi-o.jpg 的已配置根目录
- html - Container of nav.logo move when i minimize screen
- php - 如何在 PHP 中的 ''00' - 'FF' 之间随机化一个十六进制值
- swift - 在 RealityKit 中启用手势