Статическое связывание с LAPACK - PullRequest
4 голосов
/ 24 августа 2011

Я пытаюсь выпустить какое-то программное обеспечение и сейчас работаю над сценарием для процесса сборки. Я застрял на чем-то, чего никогда не думал, статически связывая LAPACK на Linux x86_64. Во время настройки AC_SEARCH_LIB([main],[lapack]) работает, но компиляция блоков lapack не работает, например, undefiend reference to 'dsyev_' - подпрограмма lapack / blas не проходит незамеченной.

Я подтвердил, что у меня установлены библиотеки, и даже сам скомпилировал их с соответствующими параметрами, чтобы сделать их статичными с теми же результатами.

Вот пример, который я использовал в своем первом опыте с LAPACK несколько лет назад, который работает динамически, но не статически: http://pastebin.com/cMm3wcwF

Два метода, которые я использую для компиляции, следующие:

gcc -llapack -o eigen eigen.c
gcc -static -llapack -o eigen eigen.c

1 Ответ

5 голосов
/ 24 августа 2011

Ваш порядок ссылок неверен.Связывайте библиотеки после кода, который требует их, а не до.Как это:

gcc -o eigen eigen.c -llapack 
gcc -static -o eigen eigen.c -llapack

Это должно решить проблемы со связью.


Чтобы ответить на следующий вопрос, почему это работает, документация GNU ld гласит:

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

........

Обычно файлы, найденные таким образом, являются библиотечными файлами - архивфайлы, членами которых являются объектные файлы.Компоновщик обрабатывает архивный файл, просматривая его на наличие элементов, которые определяют символы, на которые до сих пор ссылались, но которые не были определены.Но если найденный файл является обычным объектным файлом, он связывается обычным способом.

т.е.компоновщик собирается выполнить один проход по файлу в поисках неразрешенных символов, и он следует файлам в том порядке, в котором вы их предоставили (т. е. «слева направо»).Если вы еще не указали зависимость при чтении файла, компоновщик не сможет удовлетворить зависимость.Каждый объект в списке ссылок анализируется только один раз.

Также обратите внимание, что GNU ld может выполнять переупорядочение в случаях, когда при связывании общих библиотек или объектных файлов обнаруживаются циклические зависимости.Но статические библиотеки анализируются только для неизвестных символов один раз.

...