почему моя команда gcc не имеет параметра -static - PullRequest
1 голос
/ 18 мая 2019

Я обычно использую gcc для компиляции моей программы на C, все работает нормально, но когда я пытался скомпилировать статическую библиотеку с параметром -static, это всегда не удавалось. Хотя я попробовал некоторые решения на Google, но это все еще не исправлено.

Моя команда выглядит следующим образом:

gcc mycode.c  -static  -L .  -lurl -lcap  -o mycode

Сообщение об ошибке:

/usr/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status

но когда я удаляю -static, он работает очень хорошо.

1 Ответ

1 голос
/ 19 мая 2019
Параметр

GCC -static позволяет компоновщику игнорировать общие библиотеки во время компоновки.Поэтому он должен найти статические версии всех библиотек, требуемых для связи, включая библиотеки, которые связаны по умолчанию, например libc.

Вы не установили статическую версию libc (что будет /usr/lib/???/libc.a), поэтому:

/usr/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status

libc.a устанавливается пакетом разработки libc.Название пакета разработки libc и способ его установки зависит от вашего дистрибутива.Например, в Debian или Ubuntu пакет для установки: libc6-dev;на Fedora это glibc-develop.

Но прежде чем делать это, повесьте галочку.Вы сказали:

Я пытался скомпилировать статическую библиотеку с параметром -static, это всегда не удавалось.

gcc mycode.c  -static  -L .  -lurl -lcap  -o mycode

Звучит так, как будто вы просто хотели связать свою программус одной или обеими статическими библиотеками liburl.a, libcap.a, расположенными в ./, и подумал, что вы должны сделать это, передав -static связыванию.

Нет необходимости передавать -staticсвязать вашу программу с ./liburl.a и / или ./libcap.a.Опции:

-L .  -lurl -lcap

будет заставлять компоновщик искать в ./ любой из файлов liburl.so (общая библиотека) или liburl.a (статическая библиотека), и если он найдет один или другой изони свяжут вашу программу с этой библиотекой .Если он найдет обоих из них в ./, он выберет общую библиотеку liburl.so.Поэтому, если у вас нет ./liburl.so , а также ./liburl.a, тогда:

-L .  -lurl

сама по себе будет связывать вашу программу с ./liburl.a.

И аналогично для-lcap.Нет необходимости в -static.Общая библиотека по умолчанию libc.so будет связана автоматически.Линкер не имеет никаких проблем, связывая вашу программу с некоторыми статическими библиотеками и некоторыми общими.Вот что уже происходит с вашей успешной связью:

gcc mycode.c  -L .  -lurl -lcap  -o mycode

при условии, что liburl.a и libcap.a являются единственными кандидатами для разрешения -lurl и -lcap в ./.

И даже если у вас есть есть и ./liburl.a и ./liburl.so - и / или ./libcap.a и ./libcap.so - все равно нет необходимости в решении, так какрезко как полностью статическая связь.Вы можете просто явно указать компоновщику найти определенную статическую библиотеку, если это то, что вам нужно, например:

gcc mycode.c  -L .  -l:liburl.a -l:libcap.a  -o mycode
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...