опция для gcc? - PullRequest
       18

опция для gcc?

21 голосов
/ 01 января 2012

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

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

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

GCC версия:

[user@localhost 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) 

Ответы [ 3 ]

57 голосов
/ 01 января 2012

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

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

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

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

11 голосов
/ 01 января 2012

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

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

0 голосов
/ 01 января 2012

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

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

при условии, что система Linux

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

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





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

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

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

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

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

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

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

-static

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

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

-pie

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

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

...