Я скомпилировал LAPACK и BLAS, но моя система не может распознать библиотеку

Я работаю над проектом, написанным на смеси Fortran 90 и Fortran 77, и теперь мне нужно связать библиотеки LAPACK / BLAS из netlib.org с проектом в среде Linux. Я использовал флаги компилятора gfortran OPTS = -O2 -fPIC -m64 в данном Makefile, а затем сделал это, используя

make blaslib
make

И закончилось нормально, по крайней мере, мне так кажется.

Затем я скопировал файлы в /usr/local/lib, /usr/local/bin/ и /usr/local/lib64/, но это не сработало. Я даже использовал опцию -L/path/to/lapack/liblapack.a, и она тоже не сработала.

Когда я компилирую свой код, я получаю следующую ошибку:

qrB.o: In function `qrfactorizeb_':
qrB.f90:(.text+0x64f): undefined reference to `zgeqp3_'
collect2: ld returned 1 exit status
make: *** [run] Error 1

Я действительно не знаю, что делать с этой ошибкой. Я тестировал его на 3 других рабочих станциях, и это не помогло! Может кто-нибудь мне помочь?


person Mahdi Kazempour    schedule 22.07.2013    source источник
comment
Вы пробовали gfortran -o qrB.o qrB.f90 -llapack?   -  person Kyle Kanos    schedule 25.07.2013
comment
Если приведенное выше не помогло, вам также может потребоваться добавить -lblas.   -  person Eugene B    schedule 25.07.2013
comment
Спасибо за ваш ответ. :) На самом деле я сначала попробовал эти команды, -lblas -llapack. Но указанные флаги не работали !!! Вот и запуталась ... Я даже удаляю все предыдущие версии и устанавливаю новую, т.е. копирую в / usr / local / lib /, а это не работает! Я очень запутался и не знаю, что делать!   -  person Mahdi Kazempour    schedule 25.07.2013


Ответы (1)


Некоторое время назад у меня была такая же проблема! Двойная работа с Windows и Linux, а также простота игры с опциями в Windows научили меня кое-чему интересному!

Попробуйте скомпилировать, например: [...] $ ifort liblapack.a libblas.a libslatec.a * .o -o profmm

и, как вы знаете, это означает, что я хочу использовать 3 библиотеки для компиляции и связывания моих файлов в выходной файл profmm. В нем нет синтаксической ошибки, но это приводит к множеству ошибок, например: preconditioner3.o: В функции factorb_': preconditioner3.f:(.text+0x1add): undefined reference tozgetrf_ '. . preconditioner.o: В функции factorpre_': preconditioner.f:(.text+0x13a2): undefined reference tozgetrf_ 'preconditioner.f :(. text + 0x18bb): неопределенная ссылка на zgetri_' zbesh.o: In functionzbesh_': zbesh.f :(. text + 0xb3): неопределенная ссылка на d1mach_' zbesh.f:(.text+0xcf): undefined reference toi1mach_ '. . . и многие другие ошибки, указывающие на то, что ifort не может читать мои библиотеки, хотя они находятся в моем текущем каталоге!

Но просто измените команду следующим образом: [...] $ ifort * .o liblapack.a libblas.a libslatec.a -o profmm

и он работает нормально, без ошибок! Значит, теперь ifort может читать мою библиотеку (локальную)! Также обратите внимание, что изменение порядка библиотек очень важно, и это зависит от порядка использования этих подпрограмм внутри программы. Поэтому всегда пытайтесь переупорядочить цепочку библиотек, чтобы проверить возможные ошибки.

Надеюсь, это поможет.

person M.Takrimi    schedule 26.07.2013