Ошибка неопределенной ссылки gfortran LAPACK

Я установил LAPACK в Ubuntu, выполнив инструкцию,

sudo apt-get install liblapack-dev

таким образом, я могу найти /usr/lib/libblas/libblas.a и /usr/lib/lapack/liblapack.a, а затем протестировать их в gfortran с помощью randomsys1 пример,

  gfortran -llapack -lblas randomsys1.f90
  gfortran -llapack -L/usr/lib/lapack -lblas -L/usr/lib/libblas randomsys1.f90

но я получил следующие ошибки (dgesv - процедура LAPACK):

/tmp/ccnzuuiY.o: In function `MAIN__':
randomsys1.f90:(.text+0xb): undefined reference to `init_random_seed_'
randomsys1.f90:(.text+0x3c2): undefined reference to `dgesv_'
collect2: ld returned 1 exit status

Что-то не так с установкой LAPACK? Большое спасибо!


person Randel    schedule 18.12.2013    source источник
comment
Попробуйте поместить команды ссылки (то есть -llapack -lblas) после имени файла, который вы пытаетесь скомпилировать. В противном случае компоновщик может попытаться разрешить символы в неправильном порядке.   -  person janneb    schedule 19.12.2013
comment
Большое спасибо, @janneb! Это сработало!   -  person Randel    schedule 19.12.2013


Ответы (1)


См. документацию gcc / gfortran:

-llibrary, -l library

При компоновке ищите библиотеку с именем library. (Вторая альтернатива с библиотекой в ​​качестве отдельного аргумента предназначена только для соответствия POSIX и не рекомендуется.)

Имеет значение, где в команде вы пишете эту опцию; компоновщик ищет и обрабатывает библиотеки и объектные файлы в том порядке, в котором они указаны. Таким образом, «foo.o -lz bar.o» выполняет поиск в библиотеке «z» после файла foo.o, но перед bar.o. Если bar.o относится к функциям в «z», эти функции могут не быть загружены.

Компоновщик ищет библиотеку в стандартном списке каталогов, который на самом деле является файлом с именем liblibrary.a. Затем компоновщик использует этот файл, как если бы он был указан точно по имени.

Исследуемые каталоги включают несколько стандартных системных каталогов, а также каталоги, указанные вами с помощью -L.

Обычно файлы, найденные таким образом, являются файлами библиотек - архивными файлами, членами которых являются объектные файлы. Компоновщик обрабатывает архивный файл, сканируя его на предмет элементов, которые определяют символы, на которые до сих пор ссылались, но не были определены. Но если найденный файл является обычным объектным файлом, он связывается обычным образом. Единственная разница между использованием опции -l и указанием имени файла заключается в том, что -l окружает библиотеку «lib» и «.a» и выполняет поиск в нескольких каталогах.

Таким образом, вы должны сначала указать -L/directory/of/the/library, чтобы компилятор знал о каталоге, содержащем вашу библиотеку, и затем флаг -llibrary.

person MBR    schedule 19.12.2013
comment
Спасибо @MBR! Проблема была решена комментарием @janneb выше. - person Randel; 20.12.2013