CS107 Compilando Programas em C com GCC
Escrito por Chris Gregg, com modificações por Nick Troccoli
Clique aqui para um vídeo.
O compilador que usaremos para o CS107 é chamado de “Coleção de Compiladores GNU” (gcc). É um dos compiladores mais utilizados, e é ambos Software Livre, e está disponível em muitas plataformas de computação diferentes.
gcc executa o passo de compilação para construir um programa, e depois chama outros programas para montar o programa e ligar as partes componentes do programa em um programa executável que você pode executar. Vamos aprender um pouco sobre cada um desses passos durante o CS107, mas o bom é que gcc pode produzir todo o programa executável (executável) para você com um comando.
No CS107, vamos usar predominantemente Makefiles para compilar, montar e vincular nosso código, mas o Makefile executa gcc para fazer o trabalho. This is just a quick overview on how to compile and run your own programs should you decide to do so without a Makefile.
The simplest way to run gcc is to provide gcc a list of .c files:
$ gcc hello.c$
Note that you do not put header files (.h) into the gcc command: it reads in the header files as it compiles, based on the #include statements inside .c files.
If the program compiled without errors or warnings, you don’t get any output from gcc, and you will have a new file in your directory, called a.out. To run this file, you need to tell the shell to run the file in the current directory, by using ./ before the name:
$ ./a.outHello, World!$
Geralmente não queremos os nossos programas nomeados a.out, por isso pode dar a gcc uma opção, -o programName, para lhe dizer o nome do ficheiro executável:
$ gcc hello.c -o hello$ ./helloHello, World!$
Nota: cuidado para não introduzir acidentalmente um nome de ficheiro executável que seja o mesmo que o seu ficheiro de entrada – algo como:
$ gcc hello.c -o hello.c
On myth, o seu perfil foi configurado para apanhar o erro e não compilá-lo, deixando o seu ficheiro-fonte em tacto. Este não é o caso em muitos outros sistemas Linux, por isso tenha cuidado! Em outros sistemas, o GCC sobrescreveria seu arquivo fonte com o novo executável.
gcc toma muitas opções diferentes de linha de comando (flags) que mudam seu comportamento. Uma das bandeiras mais comuns é a de “nível de otimização”, -O (maiúsculas ‘o’). gcc tem a capacidade de optimizar o seu código para diversas situações.
- -O ou -O1: Optimizar. Otimizar a compilação leva um pouco mais de tempo, e muito mais memória para uma grande função. Com
-O, o compilador tenta reduzir o tamanho do código e o tempo de execução, sem realizar nenhuma otimização que leve muito tempo de compilação. - -O2: Otimize ainda mais. O GCC executa quase todas as otimizações suportadas que não envolvem um tradeoff de velocidade espacial. Em comparação com
-O, esta opção aumenta tanto o tempo de compilação quanto a performance do código gerado. - -O3: Otimize ainda mais.
-O3ativa todas as otimizações especificadas por-O2e também ativa outras otimizações. Esta é frequentemente a melhor opção a utilizar. - -O0: Reduza o tempo de compilação e faça com que a depuração produza os resultados esperados. Esta é a opção padrão.
- -Os: Optimizar para o tamanho.
-Oshabilita todas-O2otimizações que normalmente não aumentam o tamanho do código. Também realiza outras otimizações projetadas para reduzir o tamanho do código. - -Ofast: Desconsiderar o cumprimento de normas rigorosas.
-Ofastpermite todas as-O3optimizações. Também permite optimizações que não são válidas para todos os programas em conformidade com as normas. - -Og: Otimize a experiência de depuração.
-Ogpermite optimizações que não interferem com a depuração. Deve ser o nível de otimização escolhido para o ciclo padrão de edição-compilação-debug, oferecendo um nível razoável de otimização enquanto mantém uma compilação rápida e uma boa experiência de debugging. Usaremos-Ogno CS107 quando estivermos depurando.
Ver o man página para gcc para mais detalhes sobre otimização (ou veja aqui para mais informações sobre otimizações).
Outra bandeira comum é a opção -std=gnu99, que diz gcc para usar a “versão gnu c do padrão c de 1999”. O padrão fornece uma sintaxe tal como ser capaz de definir uma variável dentro de uma declaração de loop (por exemplo, for (int i = ...)). Nós usaremos esta norma no CS107.
Também usaremos a bandeira -g, que nos permite usar o depurador, gdb, para nos dar números exatos de linha em nosso código quando o rodamos.
Exemplo:
$ gcc -std=gnu99 -g -Og loop.c -o loop
Se você estiver interessado em mais informações sobre gcc, confira a Seção 1 deste documento Stanford Unix Programming Tools, bem como o manual completo do gcc(GNU).