Статическое связывание с LAPACK

Я пытаюсь сделать выпуск некоторого программного обеспечения и в настоящее время работаю над сценарием для процесса сборки. Я застрял на том, о чем никогда не думал, что буду, статически связывая LAPACK с x86_64 linux. При настройке 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

person nlucaroni    schedule 24.08.2011    source источник


Ответы (1)


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

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

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


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

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

........

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

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

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

person talonmies    schedule 24.08.2011
comment
В самом деле, я мог бы поклясться, что читал во время моих поисков прошлой ночью/сегодня, что современные компоновщики изменят их порядок. Это работает, но, похоже, теперь он не может найти мои подпрограммы blas - даже с -lblas. Ваше здоровье. - person nlucaroni; 24.08.2011
comment
другие библиотеки, необходимые для полноценной работы, -llapack -lblas -lgfortran -lm. - person nlucaroni; 24.08.2011
comment
Компоновщик попытается настроить порядок компоновки, чтобы удовлетворить график активных зависимостей. Но операторы компоновки по-прежнему читаются слева направо, и если вы укажете библиотеку, для которой нет зависимости в текущем наборе, она просто будет пропущена. Что я здесь и делаю. - person talonmies; 24.08.2011
comment
Что вы имеете в виду, нет зависимости в текущем наборе? Есть зависимость, моя программа зависит от нее. - person nlucaroni; 24.08.2011
comment
Но ваша программа не была скомпилирована в объект, когда указана библиотека (помните, читайте слева направо), поэтому она пропускается. - person talonmies; 24.08.2011
comment
тогда почему библиотеки должны быть перечислены в обратном порядке? Например, -llapack -lm -lblas -lgfortran не компилируется; если он читается слева направо, то он должен быть в активных зависимостях --lapack и мое приложение будет зависеть от m. - person nlucaroni; 24.08.2011
comment
Смотрите мою правку. Lapack требует Blas, им обоим требуется среда выполнения fortran, а для этого, в свою очередь, требуется математическая библиотека C. если вы предоставляете математическую библиотеку перед библиотекой fortran, компоновщик еще не знает, что она ему нужна. - person talonmies; 24.08.2011
comment
Мое замешательство основано на том, что компоновщик попытается настроить порядок компоновки, чтобы удовлетворить график активных зависимостей. Я этого не вижу, и в описании, которое вы дали, об этом не упоминается. - person nlucaroni; 25.08.2011