Параметр
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