I am trying to compile a Cython program, but I get an error trying to link LAPACK and BLAS (it can't find the libraries). I have Anaconda Accelerate, which automatically links MKL to NumPy, so I tried to copy NumPy's link.
>>> import numpy as np
>>> np.show_config()
mkl_info:
include_dirs = ['/home/ubuntu/miniconda3/envs/LDFMap/include']
define_macros = [('SCIPY_MKL_H', None)]
libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
library_dirs = ['/home/ubuntu/miniconda3/envs/LDFMap/lib']
blas_mkl_info:
include_dirs = ['/home/ubuntu/miniconda3/envs/LDFMap/include']
define_macros = [('SCIPY_MKL_H', None)]
libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
library_dirs = ['/home/ubuntu/miniconda3/envs/LDFMap/lib']
lapack_mkl_info:
include_dirs = ['/home/ubuntu/miniconda3/envs/LDFMap/include']
define_macros = [('SCIPY_MKL_H', None)]
libraries = ['mkl_lapack95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
library_dirs = ['/home/ubuntu/miniconda3/envs/LDFMap/lib']
blas_opt_info:
include_dirs = ['/home/ubuntu/miniconda3/envs/LDFMap/include']
define_macros = [('SCIPY_MKL_H', None)]
libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
library_dirs = ['/home/ubuntu/miniconda3/envs/LDFMap/lib']
openblas_lapack_info:
NOT AVAILABLE
lapack_opt_info:
include_dirs = ['/home/ubuntu/miniconda3/envs/LDFMap/include']
define_macros = [('SCIPY_MKL_H', None)]
libraries = ['mkl_lapack95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
library_dirs = ['/home/ubuntu/miniconda3/envs/LDFMap/lib']
So this is my setup.py
file
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
from Cython.Build import cythonize
import numpy as np
import os
setup(
author = "Rohan Pandit",
url='https://www.github.com/rohanp/LDFMap',
ext_modules = cythonize([Extension("LDFMap",
sources = ["LDFMap.pyx"],
include_dirs = [np.get_include(), "/home/ubuntu/LDFMap/src/include", "/home/ubuntu/miniconda3/envs/LDFMap/include"],
language="c++",
libraries = ['mkl_lapack95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread'],
library_dirs = ["/home/ubuntu/LDFMap/src/include", '/home/ubuntu/miniconda3/envs/LDFMap/lib'],
extra_compile_args = ["-I /home/ubuntu/LDFMap/src/include", "-I /usr/local/include"],
)])
)
and here is my error message: (I added line breaks for readability)
g++ -pthread -shared -L/home/ubuntu/miniconda3/envs/LDFMap/lib -Wl,
-rpath=/home/ubuntu/miniconda3/envs/LDFMap/lib,--no-as-needed
build/temp.linux-x86_64-3.4/LDFMap.o -L/home/ubuntu/LDFMap/src/include
-L/home/ubuntu/miniconda3/envs/LDFMap/lib -
L/home/ubuntu/miniconda3/envs/LDFMap/lib -lmkl_lapack95_lp64 -
lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -
lpython3.4m -o /home/ubuntu/LDFMap/src/LDFMap.cpython-34m.so
/usr/bin/ld: cannot find -lmkl_lapack95_lp64
What I don't understand is if this link worked for NumPy, why isn't it working for my program?
Specifying explicitly the include path and BLAS/LAPACK libraries for your installation is going to lead to a very platform dependent and difficult to maintain module.
What you should do instead, is to use scipy to get the pointer to the LAPACK functions you need, as explained in this post (see in particular the gist in the first link). This way, if Scipy was installed with MKL, your Cython program will also use automatically use MKL BLAS/LAPACK.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.