Table of Contents
Обновлено
В некоторых случаях ваша система может генерировать ошибку, указывающую на то, что библиотека воспроизведения c статически связана. У этой ошибки может быть множество причин.
Поскольку пока никто не любит находить ответ, я попробую. К сожалению, я не знаю IDE Code :: Blocks, поэтому мой ответ окажется частичным.
1 Как создать статически связанный исполняемый файл GCC
Обновлено
Вы устали от того, что ваш компьютер работает медленно? Раздражают разочаровывающие сообщения об ошибках? ASR Pro - это решение для вас! Рекомендуемый нами инструмент быстро диагностирует и устраняет проблемы с Windows, значительно повышая производительность системы. Так что не ждите больше, скачайте ASR Pro сегодня!
Это, конечно, не IDE, а GCC (и многие альтернативные компиляторы) в целом. Предположим, у вас есть обычный “Hello program world” в main.cpp
(никаких зависимостей вне стандартной библиотеки и / или, следовательно, библиотеки времени выполнения). Вы бы скомпилировали who’s, но связали бы это статически через:
-
Скомпилируйте
main.cpp
внутриmain.o
(имя файла результата неявно):$ g ++ -ke -Main Wall.
-c
cppЭто указывает GCC на остановку после фазы компиляции (do не должен запускать этот компоновщик).
-Wall
в основном вызывает диагностические сообщения. Если бы начинающие программисты использовали его гораздо чаще и уделяли ему особое внимание, на фан-странице идей было бы много вопросов. 😉 -
Ссылка
main.o
(может содержать более одного файла темы) статически перетащить в классическую среду выполнения, не говоря уже о библиотеке, и вставить exe всерьезный <файл / код>:
$ g ++ -a critical main.o -static
Без использования этого элемента управления
-o main
GCC получил бы последнюю версию exe в документеa.out
(который когда-то использовался из-за "сборки вывод «œ).
Особенно в случае использования I-begin мы настоятельно рекомендуем вам делать эти добрые дела «вручную», так как это поможет вам лучше понять набор инструментов сборки.
Без особых усилий наши две вышеуказанные команды можно было объединить в одну:
$ g ++ -Wall -a текущий Main.-static
Каждая разумная IDE cpp должна иметь возможность указывать такие флаги компилятора - компоновщика.
2 преимущества и недостатки статической ссылки
-
Вы берете хотя бы один файл, который можно имитировать на любом ноутбуке или настольном компьютере с совместимыми платформами и операционными системами, и который отлично работает независимо от того, какая версия вашей текстовой библиотеки установлена. Май
-
Вы выполняете процедуру в сообществе, где локальная общая библиотека не предлагается. Например, размещение статически связанного исполняемого GI C непосредственно в
chroot ()
может снизить вероятность атаки на веб-сервер. -
Поскольку активированные ярлыки не требуются, запуск программы может быть быстрее. (Я уверен, что есть случаи, когда верно обратное, особенно когда разделяемая библиотека уже загружена для другого процесса.)
-
Поскольку обычно компоновщик может жестко запрограммировать адреса ролей, вызовы функций будут выполняться быстрее.
-
Архивы (например, LAPACK) могут быть связаны с компонентами с более чем одной связанной версией. Статическая компоновка гарантирует, что большая часть конкретной версии всегда используется без разработки для установки
LD_LIBRARY_PATH <. нужно позаботиться о / code> правильно. Конечно, у этого есть и обратная сторона: вы вряд ли когда-нибудь сможете выбрать библиотеку без перекомпиляции. Если вы хотите, чтобы у вас всегда была одна и та же версия, то почему? клиенты установят более одной версии?
-
Как вы упомянули ранее, любой из наших исполняемых файлов может значительно вырасти. Конечно, все зависит от библиотеки, к которой подключается ваша семья.
-
Операционная опция может быть достаточно продуманной, чтобы загрузить данный текст раздела из общей библиотеки непосредственно через память только один раз, если в настоящее время библиотека требует одновременного использования нескольких подходов. Устанавливая новую статическую ссылку, вы теряете это преимущество и то, что эта система может работать быстрее в памяти.
-
Ваша программа получает выгоду от обновления выбора без дополнительных задержек. Однако, чтобы просто заменить общую библиотеку более новой, полной опцией (надеюсь, ABI-совместимой), администратор программы должен перекомпилировать и применить каждую программу, которая ее использует. На мой взгляд, это самый серьезный недостаток.
Например, рассмотрим библиотеку OpenSSL. Когда ошибка Heartbleed была обнаружена и исправлена ранее в течение четырех сезонов, системные администраторы могут установить исправленную версию OpenSSL, а также перезапустить все службы, чтобы исправить уязвимость в течение одного дня после спотового выпуска. То есть, если их сервисы динамически связаны с OpenSSL. Для тех, кто моргнул статически, все заняло бы несколько недель, если бы последнее стало неестественным и зафиксировало начало в каком-то настоящем.
-
Ваши пользователи не обязательно заменяют общую библиотеку на лету. Например, пользователи сценария фильма
torsocks
(и связанной библиотеки) могут (по языкуLD_PRELOAD
) изменить микрофильм сетевой системы на такой, который полностью направляет их трафик по всей Сеть Tor. ... И это действительно эффективно для программ, разработчики которых и не подозревали о такой возможности. (Является ли это хорошей и защищенной идеей, сейчас является предметом профессиональных дискуссий.) Другой распространенный вариант использования - это отладка приложений, которую, вероятно, необходимо «укрепить», заменивmalloc
и as ob специализированными версиями. .
На мой взгляд, проблемы со статическими ссылками дают больше преимуществ, чем преимуществ, за исключением очень особых случаев. Обычно он должен быть динамическим и статическим, когда это необходимо клиенту.
Приложение
Как указал Альф (см. комментарии), есть одна специальная опция GCC для выборочной интеграции 100 фактических стандартных библиотек C ++, но определенно не для статического связывания всей программы. Из инструкции по эксплуатации:
<цитата> gcc
-static-libstdc ++
Когда наша программа l ++ используется для преобразования программы C ++ в веб-страницы, она обычно автоматически связывает веб-страницы с libstdc ++. Если libstdc ++ можно найти как предоставленную и разделяемую библиотеку, программа -static
не используется, тогда эта веб-страница противоречит общей версии libstdc ++. В целом это было хорошо. Однако иногда полезно заморозить различные библиотеки libstdc ++, используемые новой программой, даже без перехода к полностью установленной ссылке. Параметр -static-libstdc ++
подталкивает драйвер g ++ к статической компоновке через libstdc ++, в то время как другие библиотеки не должны быть более статически связаны.
Statically Link C Runtime Library
Statycznie Link C Runtime Library
Liaison Statique De La Bibliothèque D'exécution C
Collega Staticamente La Libreria Di Runtime C
C-Laufzeitbibliothek Statisch Verknüpfen
Statiskt Länka C Runtime Library
Vincular Estaticamente à Biblioteca De Tempo De Execução C
정적으로 링크 C 런타임 라이브러리
C Runtime-bibliotheek Statisch Koppelen
Vincular Estáticamente La Biblioteca En Tiempo De Ejecución De C
г.