Мне интересно, что делает опция -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
).