Table of Contents
Atualizado
Em alguns casos, seu novo sistema pode gerar um erro indicando que toda a biblioteca de tempo de execução c está estaticamente vinculada. Pode haver muitas razões para esse erro.
Uma vez que ainda se gosta de encontrar uma resposta, vou tentar. Infelizmente, não estou familiarizado com o IDE Code :: Blocks, então minha fórmula será parcial.
1 Como criar um executável GCC vinculado estaticamente
Atualizado
Você está cansado de ver seu computador lento? Irritado com mensagens de erro frustrantes? ASR Pro é a solução para você! Nossa ferramenta recomendada diagnosticará e reparará rapidamente os problemas do Windows, aumentando drasticamente o desempenho do sistema. Então não espere mais, baixe o ASR Pro hoje mesmo!
Isso não é específico do IDE, mas do GCC (e muitos outros compiladores) em geral. Suponha que você possua um simples “Hello program world” em main.cpp
(sem dependências de tópico fora da biblioteca típica e, portanto, da biblioteca de tempo de execução). Você iria compilá-lo, mas vinculá-lo estaticamente via:
-
Compilar
main.cpp
emmain.o
(nome do arquivo de resultado implicitamente):$ g ++ -ke -Main Wall.
-c
cppIsso diz ao GCC para parar após o tempo de compilação (não execute este linker).
-Wall
praticamente ativa mensagens de diagnóstico. Se os programadores novatos o recomendassem com mais frequência e prestassem atenção especial para ajudá-lo, haveria muitas perguntas na página de ideias. 😉 -
Link
main.o
(pode conter mais do que um arquivo de objeto específico) estaticamente arraste e solte em runtime e biblioteca antiquados e cole o exe envolvido comprincipal
: $ d ++ -o crítico main.o -static
Sem contratar o controle
-o main
, o GCC poderia possivelmente ter o exe mais recente em qualquer documentoa.out
mal chamado (que já foi antigo para "assembly saída "œ).
Especialmente ao usar o I-begin, recomendamos fortemente que seu site faça essas coisas "manualmente", pois também pode ajudá-lo a entender melhor a caixa de ferramentas de construção.
Na verdade, nossos dois comandos acima podem ser combinados em um:
$ r ++ -Wall -o main atual.-static
Todo IDE cpp razoável deve ser capaz de especificar sinalizadores de compilador / vinculador de classificação.
2 vantagens e desvantagens de um link estático
-
Você pega um arquivo que pode ser imitado em qualquer computador com estruturas e sites operacionais compatíveis e funciona muito bem, independentemente da variante da biblioteca de texto instalada. Maio
-
Você está executando um procedimento apenas em um ambiente onde a biblioteca compartilhada local não está disponível. Por exemplo, colocar um GI executável C estaticamente relevante diretamente em
chroot ()
pode ajudar potencialmente a prisão a reduzir a superfície conectada a um ataque de pânico ou medo no servidor baseado na web. -
Como os atalhos ativados sem dúvida não são necessários, a inicialização do programa pode ser mais rápida. (Eu sou selecionado que existem eventos onde o oposto será verdadeiro, especialmente quando uma biblioteca compartilhada é provavelmente carregada em outro processo.)
-
Como o vinculador pode codificar os endereços de função, realizar chamadas pode ser mais rápido.
-
Uma biblioteca (por exemplo, LAPACK) pode ser vinculada a dispositivos com mais de uma versão vinculada. Os links estáticos garantem que uma versão específica seja sempre executada sem a necessidade de definir
LD_LIBRARY_PATH <. pode precisar se preocupar com / code> corretamente. Claro, isso também tem uma desvantagem: você quase nunca pode escolher uma biblioteca sem recompilar. Se a pessoa deseja ter sempre a mesma versão, por que os clientes instalariam mais de uma versão?
-
Como você mencionou anteriormente, qualquer um de nossos executáveis pode crescer significativamente. É claro que depende muito de uma biblioteca específica à qual você está se conectando.
-
Uma função operacional pode ser inteligente o suficiente para colocar aquele texto de seção específico de uma escolha compartilhada diretamente na memória apenas uma vez, se vários desenhos próximos exigirem a biblioteca ao mesmo tempo. Ao estabelecer um link estático, você perde esse privilégio e o sistema pode ser executado mais rapidamente no recall.
-
Seu programa se beneficia de alterar a biblioteca sem atrasos adicionais. No entanto, para não surpreender a substituição da biblioteca compartilhada por uma versão finalizada mais recente (com sorte, compatível com ABI), o administrador do programa precisa recompilar e instalar todos os programas que a utilizam. Na minha opinião, este é o golpe mais sério.
Por exemplo, considere a biblioteca OpenSSL. Quando o bug Heartbleed foi descoberto e corrigido pouco antes deste ano, os administradores de sistemas podem instalar a versão corrigida do OpenSSL, bem como reiniciar todos os serviços para corrigir a vulnerabilidade um dia após o lançamento do patch. Ou seja, se seu suporte estivesse dinamicamente vinculado ao OpenSSL. Para aquelas, integradas estaticamente, levaria semanas se atualmente estas não fossem naturais e fixassem o estabelecimento no presente.
-
Seu pessoal não está substituindo a biblioteca compartilhada imediatamente. Por exemplo, os usuários do set de filmes de scripts
torsocks
(e a biblioteca vinculada) provavelmente (definindoLD_PRELOAD
) alteram os arquivos do sistema de vários níveis para um que direciona seu carro inteiramente por meio da rede Tor. ... E esse item realmente funciona para programas cujos desenvolvedores nunca suspeitaram dessa possibilidade. (Se esta é uma ideia maravilhosa e segura agora é um assunto vinculado a um debate independente.) Outro caso de uso comum é a depuração de solicitação, que precisa ser "reforçada" com o reabastecimento demalloc
e como ob com versões dedicadas .
Na minha opinião, os problemas de conexão estática superam os benefícios, exceto em casos muito especializados. Normalmente, deve ser dinâmico e definido quando o cliente precisa.
Aplicativo
Como Alf apontou (veja os comentários), que existe uma opção GCC especial para uma integração de cem da biblioteca padrão C ++, mas sem dúvida não para vincular estaticamente o programa inteiro. Do manual:
gcc
-static-libstdc ++
Quando todo o meu programa g ++ é usado para converter um novo programa C ++ em páginas da web, ele geralmente deve vincular automaticamente as páginas da web para que você possa libstdc ++. Se libstdc ++ pode ser encontrada enquanto uma biblioteca compartilhada e compartilhada, a opção -sounds
não é usada, então esta n página da internet entra em conflito com a alternativa libstdc ++ geral. Isso geralmente é bom. No entanto, muitas vezes é útil congelar os vários libstdc ++ feitos pelo programa, mesmo sem ir para um link totalmente estático agradável. A possibilidade -static-libstdc ++
força o driver g ++ a vincular estaticamente libstdc ++, enquanto outras bibliotecas não devem ser vinculadas estaticamente.
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
Статическая ссылка на библиотеку времени выполнения C
정적으로 링크 C 런타임 라이브러리
C Runtime-bibliotheek Statisch Koppelen
Vincular Estáticamente La Biblioteca En Tiempo De Ejecución De C