[Linux] Uso do compilador GCC

Índice

Prefácio:

 1. Processo de compilação do GCC

1. Pré-tratamento:

2. compilar

3. Compilação

4. ligação

2. Fazendo e usando bibliotecas dinâmicas e estáticas

1. Biblioteca estática

2. Biblioteca dinâmica

 Três opções úteis

 1.gcc -E main.c

 2.gcc -E -dM main.c > 1.txt

  3.gcc -Wp,-MD,abc.dep -c -o main.o main.c

  4.echo 'main(){}'| gcc -E -v -


Prefácio:

2-1. Processo de compilação do GCC_哔哩哔哩_bilibili

2-2. Opções comuns do GCC_哔哩哔哩_bilibili

(1) A cadeia de ferramentas de compilação gcc no PC pode compilar programas que podem ser executados na plataforma X 86. Para compilar programas que podem ser executados na plataforma ARM, você deve usar a ferramenta de compilação cruzada xxx-gcc.

(2) Um arquivo C/C++ precisa passar por quatro etapas de pré-processamento (geração de arquivo .i) , compilação (geração de .s) , montagem (geração de arquivo .o) e vinculação (vinculação ao programa aplicativo) antes de se tornar um arquivo executável. do seguinte modo:

(3) Podemos controlar a saída de diferentes arquivos através de diferentes opções do gcc. As opções comumente usadas são as seguintes:

 1. Processo de compilação do GCC

1. Pré-tratamento:

Comandos de pré-processamento comuns em arquivos de origem C/C++ incluem comandos de inclusão (#inlcude), comandos de definição de macro (#define) e comandos de compilação condicional (#if, #ifdef).

O pré-processamento é inserir o arquivo a ser incluído no arquivo original, expandir a definição da macro, selecionar o código a ser usado de acordo com o comando de compilação condicional e, finalmente, enviar essas coisas para um arquivo .i para processamento posterior

2. compilar

A compilação é para "traduzir" o código C/C++ (o arquivo .i acima) em código assembly.

3. Compilação

 Assembly é traduzir a saída do código assembly na segunda etapa em código de máquina que esteja em conformidade com um determinado formato, que geralmente é expresso como um arquivo de objeto ELF (arquivo OBJ) em um sistema Linux.

4. ligação

A vinculação consiste em vincular o arquivo OBJ gerado na etapa anterior com o arquivo OBJ e o arquivo de biblioteca da biblioteca do sistema e, por fim, gerar um arquivo executável que pode ser executado em uma plataforma específica. 

2. Fazendo e usando bibliotecas dinâmicas e estáticas

Preste atenção especial ao caminho da biblioteca usada.

1. Biblioteca estática

O arquivo compilado usando a biblioteca estática é relativamente grande, o que integra todos os dados de toda a biblioteca de funções no código-alvo.Sua vantagem é que o programa de execução compilado não precisa de suporte de biblioteca de funções externa.

gcc -c -o main.o main.c
gcc -c -o sub.o sub.c
//Cria uma biblioteca estática a partir do arquivo .o
ar crs libsub.a sub.o 
//(Se .a não estiver no diretório atual, você precisa especificar seu caminho absoluto ou relativo)
gcc -o test main.o libsub.a 

Nota: Use o comando ar para gerar uma biblioteca estática, você deve usar o arquivo .o para gerá-la (outros arquivos não podem ser usados). E o arquivo .a gerado deve começar com lib (ou a biblioteca não pode ser encontrada).

2. Biblioteca dinâmica

A biblioteca de funções dinâmicas não é compilada no código de destino ao compilar, e a função correspondente na biblioteca de funções é chamada quando o programa é executado para a função relevante.

Portanto, em comparação com a biblioteca estática, a biblioteca dinâmica economiza espaço no sistema. Ao encontrar um bug na biblioteca, basta substituir a biblioteca original por uma nova.

gcc -c -o main.o main.c
gcc -c -o sub.o sub.c
gcc -shared -o libsub.so sub.o
gcc -o test2 main.o -L   /directory/  -lsub 
//(Pegue o diretório atual como exemplo)
gcc -o test2 main.o -L ./ -lsub

 Observação: o arquivo de biblioteca dinâmica gerado está na pasta atual e seu caminho precisa ser adicionado a lib ou ao caminho especificado durante a compilação.

Se não houver lib, você também precisará executar o seguinte comando ( especifique o caminho ) em tempo de execução:

exportar LD_LIBRARY_PATH=$LD_LIBRARY_PATH: ./
./teste2

Execute testes ( especifique o caminho ): 

 Três opções úteis

 1. gcc -E main.c

Visualize os resultados do pré-processamento, como qual arquivo de cabeçalho é  o resultado específico:

 2. gcc -E -dM main.c > 1.txt

 Expandir todas as macros e armazená-las em 1.txt, um exemplo específico (abrir 1.txt): 

  3. gcc -Wp,-MD,abc.dep -c -o main.o main.c

Gere o arquivo dependente abc.dep, que será utilizado posteriormente no Makefile, exemplo específico (abra abc.dep):

  4. echo 'main(){}'| gcc -E -v -

Liste o diretório do arquivo de cabeçalho e o diretório da biblioteca (LIBRARY_PATH) ao compilar 'main(){}', exemplo específico:

Acho que você gosta

Origin blog.csdn.net/weixin_42373086/article/details/129887540
Recomendado
Clasificación