-статический вариант для GCC?

мне интересно, что делает параметр-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 ответов


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

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

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

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

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

мне интересно, какой -static опция на gcc делает.

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

-static

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

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

-pie

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

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


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

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

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

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


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

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