2017-01-30 25 views
1

Я написал программу на C++. Связывание и управление работают, если я не использую параметр «-статический» для g ++. Но я должен запустить его с USB-Live Stick Antergos с настройками по умолчанию, и GSL не включен. В руководстве GSL они рекомендуютОшибка при связывании GSL с -static

$ g++ -c main.cpp 
$ g++ -static main.o -lgsl -lgslcblas -lm -lnlopt 

Но для этого кода я получаю сообщение об ошибке:

/usr/bin/ld: cannot find -lgsl 
/usr/bin/ld: cannot find -lgslcblas 
collect2: Fehler: ld gab 1 als End-Status zurück 

Я пытался как this question, но это не работает для меня. Когда я бегу

$ g++ -O2 -o test main.cpp -lgsl -lgslcblas -lnlopt -lm 
$ lld test 

печатает

linux-vdso.so.1 (0x00007fffa5b95000) 
libgsl.so.19 => /usr/lib/libgsl.so.19 (0x00007f8748c9a000) 
libgslcblas.so.0 => /usr/lib/libgslcblas.so.0 (0x00007f8748a5d000) 
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f87486d5000) 
libm.so.6 => /usr/lib/libm.so.6 (0x00007f87483d1000) 
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f87481ba000) 
libc.so.6 => /usr/lib/libc.so.6 (0x00007f8747e1c000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f87490fe000) 

Так что я попытался создать символьную ссылку, но у меня есть также "libgsl.so"

$ ls /usr/lib/libgsl 
libgslcblas.so  libgslcblas.so.0.0.0 libgsl.so.19   
libgslcblas.so.0  libgsl.so    libgsl.so.19.3.0 

Я делаю что-то глупое? Спасибо за вашу помощь.

ответ

3

Когда вы проходите -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 является поиск компоновщика по умолчанию дорожка.

+0

Благодарим за быстрый ответ. Это правда, у меня нет 'libgsl.a'. У меня Arch Linux, поэтому я установил _gsl 2.3-1_. Но в репозитории нет пакета разработки. Можете ли вы сказать мне, является ли [эта страница] (https://savannah.gnu.org/git/?group=gsl) правильной? –

+0

@ 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. Вы знаете, как их построить? –

+0

Я пробовал, но нет, я не знаю. Я загрузил _release-2.3_, но он не содержал файл _configure_ только _configure.ac_. Когда я запускаю 'autoconf configure.ac', я получаю некоторую ошибку. 'configure.ac:6: ошибка: возможно неопределенный макрос: AM_INIT_AUTOMAKE' ' configure.ac: 8: ошибка: возможно неопределенный макрос: AM_MAINTAINER_MODE' –