Когда вы проходите -lgsl
, по умолчанию вы запрашиваете компоновщик найти и ссылку либо разделяемую библиотеку libgsl.so
или статическую библиотеку libgsl.a
и предпочесть общую библиотеку, если оба находятся в том же каталоге поиска. Линкером будет поиск, во-первых, в любых каталогах , которые вы указали с опциями -L/path/to/search
, в указанном порядке, а затем в каталогах поиска по умолчанию (/usr/lib
и т. Д.). Аналогично для -lgslcblas
.
Но когда вы передаете опцию связи -static
в gcc/g++
, она предотвращает связь с любыми разделяемыми библиотеками. Общие библиотеки, libgsl.so
, libgslcblas.so
будут игнорироваться. Статические библиотеки libgsl.a
, libgslblas.a
, должно быть было найдено, в той или иной поисковой каталоге, для связи с .
Компоновщик говорит:
/usr/bin/ld: cannot find -lgsl
/usr/bin/ld: cannot find -lgslcblas
, потому что он не может найти эти статические библиотеки - по-видимому, потому что вы не установили их.
Вы не говорите, что Linux дистрибутивом вы работаете, но если пакет , который обеспечивает libgsl
и libgslcblas
называется, скажем, libgsl[suffix]
тогда будет соответствующий пакет под названием libgsl-dev
, libgsl-devel
, или аналогичный. Это будет разработка версия пакета, для использования людьми, которые хотят разработать программное обеспечение, которое ссылается на libgsl
или libgslcblas
. Для пакета разработки потребуется пакет libgsl
в качестве зависимости - поэтому он будет устанавливать те же самые вещи - и дополнительно будет содержать файлы заголовков и статическую версию библиотеки.
Поэтому вам необходимо установить пакет разработки libgsl
для вашего дистрибутива. Для Ubuntu, например, что libgsl-dev
:
Позже
я заключаю, что ваш дистрибутив, Arch Linux, не делает отдельные пакеты Dev. Вам необходимо создать статические библиотеки из источника. Для этого вам нужно будет по крайней мере установили:
GNU Make
GNU autotools (autoconf, automake, libtool)
GCC (C compiler)
texinfo
Затем сделать сборку по умолчанию:
Получить исходный пакет GSL из https://savannah.gnu.org/git/?group=gsl
либо путем клонирования GIT репозиторий или загрузки ток tar.gz
tarball и извлечение его.
cd
в каталог упаковки.
пробег ./autogen.sh
. Это будет успешным, если выполнены условия GNU autotools .
пробег ./configure --enable-maintainer-mode
(как указано ./autogen.sh
). Это будет успешным при условии, что зависимости пакета удовлетворены и проверки безопасности окружающей среды пройдут.
пробег make
Если make
завершается без ошибок - это займет считанные минуты - тогда как корень, запустите make install
.
Если все хорошо, это будет установить недостающие статические библиотеки:
/usr/local/lib/libgsl.a
/usr/local/lib/libgslcblas.a
Вам не нужно изменять вашу команду тяг для компоновщика, чтобы найти им: /usr/local/lib
является поиск компоновщика по умолчанию дорожка.
Благодарим за быстрый ответ. Это правда, у меня нет 'libgsl.a'. У меня Arch Linux, поэтому я установил _gsl 2.3-1_. Но в репозитории нет пакета разработки. Можете ли вы сказать мне, является ли [эта страница] (https://savannah.gnu.org/git/?group=gsl) правильной? –
@ D.Nagel Из [this] (http://unix.stackexchange.com/questions/28972/why-are-there-no-dev-packages-in-arch-linux) кажется, что Arch Linux не " t разделить пакеты dev, и если статические библиотеки не являются в пакете акций, вам придется самостоятельно создавать их из источника. Ваша ссылка верна для получения источника либо с git repo, либо с tarMz. Исходный пакет представляет собой пакет GNU autotools. Вы знаете, как их построить? –
Я пробовал, но нет, я не знаю. Я загрузил _release-2.3_, но он не содержал файл _configure_ только _configure.ac_. Когда я запускаю 'autoconf configure.ac', я получаю некоторую ошибку. 'configure.ac:6: ошибка: возможно неопределенный макрос: AM_INIT_AUTOMAKE' ' configure.ac: 8: ошибка: возможно неопределенный макрос: AM_MAINTAINER_MODE' –