Связывание библиотек LAPACK / BLAS - PullRequest
1 голос
/ 10 мая 2010

Справочная информация:
Я работаю над проектом, написанным на смеси C и Fortran 77, и теперь мне нужно связать библиотеки LAPACK / BLAS с проектом (все в среде Linux). Рассматриваемый LAPACK - версия 3.2.1 (включая BLAS) с netlib.org. Библиотеки были скомпилированы с использованием Makefile верхнего уровня (make lapacklib и make blaslib).

Проблема:
Во время связывания сообщения об ошибках утверждали, что некоторые (не все) BLAS-подпрограммы, вызванные из LAPACK-подпрограмм, не определены. Это вызвало у меня некоторую головную боль, но проблема была в конечном итоге решена, когда (в Makefile) был изменен порядок появления библиотек, которые будут связаны.

Код:
Далее (а) выдает ошибки, а (б) - нет. Связывание выполняется (c).
(a) LIBS = $ (LAPACK) /blas_LINUX.a $ (LAPACK) /lapack_LINUX.a
(b) LIBS = $ (LAPACK) /lapack_LINUX.a $ (LAPACK) /blas_LINUX.a
(c) gcc -Wall -O -o $ @ project.o project.a $ (LIBS)

Вопрос:
В чем может быть причина неопределенных ссылок только для некоторых подпрограмм и что делает порядок появления релевантным?

Ответы [ 3 ]

1 голос
/ 20 июня 2012

Библиотека LAPACK нуждается в материалах от BLAS, а компоновщик выполняет поиск слева направо. Так что, поставив BLAS после LAPACK (опция (b)), сработало.

Если вы хотите, чтобы он работал всегда, независимо от порядка, вы можете использовать группы линкеров:

-Wl,--start-group $(LAPACK)/blas_LINUX.a $(LAPACK)/lapack_LINUX.a -Wl,--end-group

Это говорит компоновщику циклически проходить по библиотекам до тех пор, пока все символы не будут разрешены (или пока он не заметит, что повторение цикла не поможет).

0 голосов
/ 10 марта 2011

Используется ли clapack как реализация LAPACK? Если нет, вы можете попробовать использовать его.

0 голосов
/ 11 мая 2010

Обычно всегда ставят «более фундаментальную / базовую» библиотеку справа от «менее фундаментальной / базовой» - т.е. компоновщик будет искать справа от файла определение функции, появляющейся в указанном файле. Предположительно, в современных компоновщиках это больше не нужно, но это всегда хорошая идея (как в вашем случае). Я не уверен, почему это имело значение только для нескольких процедур.

...