Связывание с разделяемыми библиотеками фактически выполняется в два этапа: при сборке (где компоновщик должен найти библиотеку);И при запуске (когда динамически загружаемая операционная система должна найти библиотеку).
При сборке с библиотеками, установленными в нестандартных местах, вы указываете компоновщику, где найти библиотеку, используя параметр -L
.К сожалению, он не сообщает динамическому загрузчику, где находится библиотека.
Чтобы сообщить динамическому загрузчику местоположение динамической библиотеки, есть два способа, один из которых я рекомендую - добавить флаг при сборке.таким образом, компоновщик вставит местоположение в исполняемый файл программы для динамического загрузчика, чтобы увидеть.Это делается с помощью опции -Wl,-rpath,/path/to/lib/directory
.
. В вашем случае вам необходимо добавить опцию -Wl,-rpath,/home/user/intel/mkl/lib/intel64
в переменную makefile LIB
.
Чтобы уточнить, полная строка должна быть
LIB = -L/home/user/intel/mkl/lib/intel64 -Wl,-rpath,/home/user/intel/mkl/lib/intel64 -lmkl_core -lmkl_intel_lp64 -lmkl_intel_thread -liomp5 -lpthread -std=c++11
То есть вам нужно оба старая опция -L
(как у вас есть в коде, который вы показываете) и добавьте новую опцию.