Índice
1. Processo de compilação do GCC
2. Fazendo e usando bibliotecas dinâmicas e estáticas
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.cgcc -c -o sub.o sub.c//Cria uma biblioteca estática a partir do arquivo .oar 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.cgcc -c -o sub.o sub.cgcc -shared -o libsub.so sub.ogcc -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: