Подтвердить что ты не робот

#ИМЯ?

Мне интересно, что делает статический вариант gcc. Мне нужна эта опция при компиляции определенного приложения, однако, когда я это делаю, я получаю следующую ошибку:

gcc -static -O3 -o prog prog.c
/usr/bin/ld: cannot find -lc
collect2: ld returned 1 exit status

Что требуется для установки?

Версия GCC:

[[email protected] dir]$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.6.1/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.6.1 20110908 (Red Hat 4.6.1-9) (GCC) 
4b9b3361

Ответ 1

Мне интересно, что делает опция -static на gcc.

Просто передайте (в дополнение) флаг -v gcc чтобы узнать. И, пожалуйста, прочитайте о параметрах команды GCC и более поздней документации binutils, особенно документации ld.

предполагая систему Linux

Если у вас нет системы Linux, весь этот ответ не имеет значения

Я настоятельно рекомендую потратить несколько часов, чтобы прочитать статью Дреппера " Как написать общие библиотеки". Он подробно объясняет, что на самом деле делает динамический компоновщик. И вы должны понимать, что решать, когда вы не хотите его использовать, то есть когда вам действительно нужно статическое связывание. Я твердо убежден, что таких случаев очень мало, но когда вам действительно нужно статическое связывание (например, для sash), вы просто не можете избежать этого.





Как правило, вам следует избегать статического связывания вашего приложения (и вы должны объяснить нам, почему вы не хотите обычного динамического связывания).Я предлагаю, по крайней мере, динамически связывать системные библиотеки (особенно libc) - если вы абсолютно хотите, вы можете статически связывать менее распространенные библиотеки -.Почему вы хотите статически связать ваше приложение?Как правило, это ошибка (потому что вы не получаете выгоду от обновлений системных динамических библиотек).В частности, средства переключения службы имен из libc хотят динамические библиотеки.

Ваша система должна была установить пакет, предоставляющий статическую библиотеку libc.В Debian это пакет libc-dev, но я не знаю, что это такое в RedHat.

Чтобы узнать, что делает gcc, передайте ему флаг -v например:

  gcc -v -static -O3 -o prog prog.c

Но вы не должны статически связывать свои программы без веских причин.В моих дистрибутивах Debian в /usr/bin более 700 программ, и только одна статически связана.

Мне интересно, что -static опция -static на gcc.

Относительно того, что -static опция -static GCC, читайте на Вызов GCC. Это вариант связывания, который:

-static

В системах, которые поддерживают динамическое связывание, это переопределяет -pie и предотвращает связывание с общими библиотеками. На других системах этот параметр не действует.

Флаг -pie означает:

-pie

Создайте динамически связанный независимый от позиции исполняемый файл для целей, которые его поддерживают. Для предсказуемых результатов необходимо также указать тот же набор параметров, который использовался для компиляции (-fpie, -fpie или подопции модели) при указании этого параметра компоновщика.

Сообщение /usr/bin/ld: cannot find -lc вызывает удивление и может выявить другие проблемы (плохо установленная или поврежденная система, или отсутствует libc.a).

Ответ 2

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

Для достижения статической привязки требуется, чтобы в вашей системе существовали архивные (.a) версии ваших библиотек. so/usr/lib/libc.a/usr/lib/crt1.o и т.д.

В современных Linux-системах (когда вы используете красную шляпу): когда бинарные ссылки соединяются вместе, 1) либо помещает код в исполняемый файл через файлы .o и .a, либо 2) помещает ссылки на динамические библиотеки (. поэтому) файлы, которые разрешены /lib/ld -linux.so(или/lib64/ld-linux=x86-64.so), который всегда находится в известном месте.

Для вашей конкретной системы, если программа специально ищет статическую версию самого себя, вам необходимо установить статические версии ваших инструментов разработки. Вам нужен, как минимум, пакет glibc-static. Вам также может понадобиться libstdС++ - статический пакет.

Ответ 3

Флаг -static заставляет компоновщик принимать только статические библиотеки, а не общие библиотеки.

Если вы хотите использовать -static, вы должны убедиться, что у вас установлена ​​статическая версия библиотеки C, которая может оказаться сложной задачей (большинство систем уже не имеют статической библиотеки C). Или вам нужно отменить эффект -static. Тем не менее, в этом примере это приведет к поражению цели -static, поскольку единственная связанная с ней библиотека (неявно) является библиотекой C.