[Linux] Ferramentas básicas de desenvolvimento - artigos gcc/g++

insira a descrição da imagem aqui

Prefácio :
 No artigo anterior, apresentei como usar o vim . Depois de aprender o vim, você pode escrever código, mas o vim é apenas um editor de texto. Para executar nosso código, precisamos usar a ferramenta de compilação que apresentarei a você hoje : gcc/g++ . Entre eles, gcc é um compilador para linguagem C e g++ é um compilador para C++. Eles são os mesmos em termos de uso, então hoje focamos principalmente no gcc. Deixe-me apresentar seus métodos de uso para que você possa começar rapidamente.
 A compilação é dividida principalmente em quatro processos: pré-processamento, compilação, montagem e vinculação . Os quatro processos específicos a seguir serão combinados para introduzir o uso do gcc, e alguns conhecimentos marginais para melhorar nossa força interna serão intercalados.

1. Pré-tratamento

  • As principais funções de pré-processamento incluem principalmente substituição de macro, expansão de arquivo de cabeçalho, compilação condicional e remoção de comentários .
  • As diretivas de pré-processamento são linhas de código que começam com # .
  • instrução:gcc -E test.c -o test.i
  • -E: diz ao gcc para parar o processo de compilação após a conclusão do pré-processamento.
  • -o: Escreva o resultado da compilação atual no arquivo test.i, .ique é um programa fonte C pré-processado (nota: ainda é um programa fonte neste momento).

insira a descrição da imagem aqui

1.1 Expansão do arquivo de cabeçalho

 A expansão do arquivo de cabeçalho é para copiar o conteúdo do arquivo de cabeçalho para o código-fonte atual, o que significa que o arquivo de cabeçalho deve existir no sistema antes da compilação, então como saber se ele existe no sistema? Na verdade, não há necessidade de se preocupar. Os arquivos de cabeçalho fazem parte do ambiente de desenvolvimento. No ambiente Windows, o vs e o dev que usamos são chamados de ambientes de desenvolvimento integrados, que integram a escrita e a compilação do código. Quando baixamos esses ferramentas, um kit de desenvolvimento será selecionado, que é, na verdade, para baixar arquivos de cabeçalho e arquivos de biblioteca relacionados a C. O ambiente Linux é especialmente usado por programadores, portanto, na maioria dos ambientes Linux, coisas relacionadas ao ambiente de desenvolvimento, como: editores de código, compiladores de código, arquivos de cabeçalho/arquivos de biblioteca, etc., foram preparados para nós com antecedência Agora, nós pode começar a escrever código diretamente. O diretório é o caminho de pesquisa padrão
/usr/include/ para arquivos de cabeçalho gcc/g++ no Linux , e há muitos arquivos de cabeçalho relacionados ao desenvolvimento nesse caminho.
insira a descrição da imagem aqui

1.2 Compilação condicional

 A compilação condicional parece raramente aparecer quando normalmente escrevemos código, mas seu papel não deve ser ignorado. Presumivelmente, quando você baixa algum software, haverá uma versão comunitária, uma versão profissional, etc. De um modo geral, a versão comunitária do software terá menos funções do que a versão profissional. As poucas funções são eliminadas pela compilação condicional. Se não houver compilação condicional, para cada versão, o fabricante precisa escrever um código correspondente, o que é muito problemático durante a manutenção e pode haver problemas com a versão da comunidade. Modificado, mas não para a versão profissional. Mas com a compilação condicional, os fabricantes só precisam manter um código do começo ao fim. Para a versão da comunidade, eles precisam apenas compilar condicionalmente o código da versão profissional e cortar as funções correspondentes.

Pequenas dicas : O arquivo obtido após o pré-processamento .iainda está em linguagem C, mas é mais limpo que o nosso código-fonte.

Dois, compilar

  • Nesta fase, o gcc primeiro verifica a padronização do código e se há erros gramaticais para determinar o trabalho real a ser feito pelo código.Após a verificação estar correta, o gcc traduz o código para linguagem assembly.
  • instrução:gcc -S test.i -o test.s

insira a descrição da imagem aqui

3. Compilação

  • O estágio de montagem é converter as instruções de montagem no .sarquivo compilado em um binário reconhecível pela máquina. Esse arquivo binário também é chamado de arquivo binário de objeto relocável ou arquivo de objeto para abreviar .
  • instrução:gcc -c test.s -o test.o

insira a descrição da imagem aqui

4. Links

  • O estágio de link é vincular o arquivo de objeto e o arquivo de biblioteca para formar um programa executável
  • instrução:gcc test.o -o mytest

insira a descrição da imagem aqui
 Às vezes, vamos nos referir e chamar outras sub-rotinas externas no programa, ou usar as funções fornecidas por outro software . Neste momento, devemos adicionar a biblioteca de funções no processo de compilação. Desta forma, a compilação O compilador pode vincular todos os códigos do programa com a biblioteca de funções para gerar arquivos de execução corretos.

4.1 O que é uma biblioteca?

 Os conceitos de bibliotecas e funções de biblioteca foram mencionados acima. Para dar um exemplo simples: Quando você aprendeu a linguagem C, você deve ter usado printffunções para imprimir uma string de caracteres no visor. Naquela época, sabíamos apenas que #include <stdio.h>printf pode ser usado desde que escrevamos uma frase no início do nosso código. Agora sabemos que stdio.hé um arquivo de cabeçalho, que contém algumas declarações, pois existem printfdeclarações de função nesse arquivo de cabeçalho, então após envolvê-lo, podemos usar a função printf. O método de implementação específico de printf é realmente colocado na biblioteca. Pode-se dizer que a biblioteca nos fornece a implementação do método. A biblioteca é na verdade o arquivo de origem, após uma certa tradução e depois empacotada, fornecendo apenas um arquivo para o usuário, não para nós. Fornecer muitos arquivos de origem também pode atingir o objetivo de ocultar os arquivos de origem . Ao mesmo tempo, a biblioteca também evita que os programadores inventem suas próprias rodas. Então printf aqui é o que chamamos de função de biblioteca. A etapa de vinculação é vincular o arquivo de destino compilado a partir do código-fonte que escrevemos com a biblioteca, porque usamos a linguagem C, portanto, o link padrão é a biblioteca padrão da linguagem C. Uma biblioteca é essencialmente um arquivo que existe em um diretório específico do sistema . A grande maioria das bibliotecas de funções são colocadas /usr/libno /libdiretório.
insira a descrição da imagem aqui
 A figura acima mostra libc.so.6a biblioteca padrão da linguagem C.

4.2 Classificação das bibliotecas

 Existem dois tipos de bibliotecas: bibliotecas dinâmicas e bibliotecas estáticas . No ambiente Linux, o sufixo da biblioteca dinâmica é .so, e o sufixo da biblioteca estática é .a. No ambiente Windows, o sufixo da biblioteca dinâmica é .dll, e o sufixo da biblioteca estática é .lib. Todos os arquivos de biblioteca seguem as mesmas regras de nomenclatura, a saber: libname.后缀.xxx.
Pequenas dicas : O compilador gcc encontrará a biblioteca padrão de C por padrão e vinculará o arquivo objeto obtido compilando o código-fonte que escrevemos com o arquivo da biblioteca. É por isso que o gcc não pode compilar arquivos de origem C++, porque o gcc procura a biblioteca padrão C por padrão e não consegue encontrar a biblioteca C++.

4.3 Como os arquivos de objeto e as bibliotecas são vinculados?

 Em geral, os links se enquadram em duas categorias: links dinâmicos e links estáticos .

4.3.1 Vinculação dinâmica

 Vincular o arquivo de objeto com a biblioteca dinâmica é chamado de vinculação dinâmica . A biblioteca dinâmica é como um cibercafé. Qualquer um que queira ficar online pode ir a este cibercafé. Ou seja: a biblioteca dinâmica é compartilhada por todos os programas, e geralmente é chamada de biblioteca compartilhada . Isso significa que apenas uma biblioteca dinâmica é suficiente e pode atender às necessidades de todos os programas.
 As características do compartilhamento dinâmico da biblioteca tornam impossível perder a biblioteca dinâmica , assim como os cibercafés são bloqueados e as pessoas não podem ficar online. Depois que a biblioteca dinâmica correspondente for perdida, não apenas um programa será afetado, mas vários programas podem não ser executados normalmente.

  • Instruções ldd 可执行程序, você pode visualizar as bibliotecas dinâmicas das quais um programa executável depende.

insira a descrição da imagem aqui
 No Linux, um programa executável é compilado em um programa executável e a vinculação dinâmica é preferida.

4.3.2 Ligação estática

 Vincular um arquivo de objeto a uma biblioteca estática é chamado de vinculação estática . Uma biblioteca estática é como um shopping center: quando alguém precisa ficar on-line, vai ao shopping para comprar um computador dedicado apenas para uso próprio. Quando o compilador usar a biblioteca estática para vinculação estática, ele copiará seu próprio método para o programa de destino e o programa não dependerá mais da biblioteca estática no futuro .

  • gcc test.c -o mytest-static -static
  • Significa -staticrealizar vinculação estática, desde que haja uma biblioteca estática.
  • yum install -y glibc-static: Instale a biblioteca estática C

insira a descrição da imagem aqui
Gcc dá prioridade às bibliotecas dinâmicas por padrão.Se não tivermos bibliotecas dinâmicas, mas apenas bibliotecas estáticas, também é possível. -staticA essência é mudar a prioridade. O processo de vinculação não é necessariamente vinculação dinâmica pura ou vinculação estática, ambos podem aparecer ao mesmo tempo, mas se a -staticopção for adicionada, todos os links serão transformados em links estáticos.

  • file mytest: Verifique qual link o programa executável mytest usa.

insira a descrição da imagem aqui

4.4 Comparação das vantagens e desvantagens dos links dinâmicos e estáticos

vantagem deficiência
biblioteca dinâmica Economize recursos de forma eficaz (espaço em disco, espaço na memória, espaço na rede, etc.) Uma vez perdido, todos os programas não podem ser executados
biblioteca estática Não depende da biblioteca, o programa executável compilado com sucesso pode ser executado de forma independente e não há necessidade de pedir ao exterior para ler o conteúdo da função da biblioteca Tamanho grande, consome mais recursos

insira a descrição da imagem aqui

五、Debug&&release

Debug é o modo de desenvolvedor e o usuário finalmente usa o release . O código no modo de depuração pode ser rastreado e depurado, porque o programa executável formado no modo de depuração possui informações de depuração adicionadas a ele. Isso significa que o programa executável obtido no modo de depuração deve ser maior que o programa executável obtido no modo de liberação.
 O compilador gcc, por padrão, compila programas executáveis ​​no modo de liberação. Para compilar programas executáveis ​​no modo de depuração, você precisa adicionar -gopções, conforme a seguir:

  • gcc test.c -o mytest-Debug -g

insira a descrição da imagem aqui

  • readelf -S mytest: Leia o programa executável correspondente na forma de segmentos.
  • readelf -S mytest-Debug | grep debug: Filtre segmentos relacionados a Depuração.

insira a descrição da imagem aqui


 A partilha de hoje acabou por aqui! Se você acha que o artigo não é ruim, você pode apoiá-lo três vezes seguidas . Seu apoio é a força motriz para Chunren seguir em frente!
insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/weixin_63115236/article/details/131668990
Recomendado
Clasificación