#  > Desenvolvimento >  > Linguagens de Programação >  >  Compilando com gcc, g++ Definitivo

## magnux

magnux <[email protected]> "Keep it simple, stupid" 

*Compilando com gcc, g++ Definitivo*

Agora você poder compliar seus programas e exploit's no *nix, sem nenhum problema, usando o GCC. 

O gcc/g++ o compilador C/C++ da GNU. Pode ser baixado no site da GNU individualmente, ou como parte do pacote do EGCS 
(que inclue um conjunto de programas acessórios).

*Proto os protdo gcc/g++:* 

g++ [opções] [parâmetros] arquivos.

-v
Mostra detalhes da compilação.

-wall
Mostra todos os warnings.

-onome
Define o nome do arquivo de saída (opcional).

-w
Elimina mensagens de warning.

-I/path
Acrescenta path include.

-l/path/lib
Inclue biblioteca (lib).

-ggdb
Informações extras para o gdb.

-O
Optimiza o código (-O1,-O2,-O3).

-c
Somente compila (gera o arquivo *.o).

-S
Somente compila o arquivo, não linka.

-lcomplex
Inclue biblioteca dos complexos.

-lm Inclue
biblioteca matemática.

-E
Cria somente o arquivo pré-processado.

-C
Não inclue comentários no executável.

-g 
Gera informações para o debuger (código lento).


*Arquivos gerados pelo gcc/g++*


-qdigraph

Adiciona teclas dígrafas.

-qcompact
Deixa o código mais compacto.

-xlinguagem

Expecfica a linguagem (C, C++,assembler).

-p 
Informações para o profiler proff. 

-pg 
Informações para o gro_.

-m686 
Especifica que a máquina alvo é um 686. 

-static 
Especifica que a linkagem deve ser esttica. 

-p
Especifica inclusão de instruções para o profiler.

-pg 
Especifica inclusão de instruções para o profiler da gnu (gprof ). 

*A medida q os arquivos são compilados e linkados, são gerados alguns arquivos adicionais.
Lista-se a seguir os arquivos de entrada (*.h, *.cpp), e os arquivos de saída gerados pelo g++.*

*.h 
Arquivos header. 

*.i 
Arquivos de pr-processamento para programas em C. 

*.ii 
Arquivos de pr-processamento para programas em C++. 

.c,.cc,.C,.c++,.cpp, 
Arquivos de fonte. 

.o 
Arquivo objeto. 

.s 
Arquivo assembler. 

.a 
Arquivo de biblioteca estáticas. 

.sa 
Blocos de bibliotecas estáticas linkados ao programa. 

.so.n 
Arquivo de biblioteca dinmica. 

a.out 
Arquivo de saída (executável). 

*Exemplo de uso do gcc/g++* 


Exemplo basico: 

1. Edita o programa greenpeace.cpp com o emacs. 
Abra um terminal e execute emacs greenpeace.cpp 



```
#include <iostream> 
using namespace std; 
main() 
{ 
cout << "Green-Peace!" << endl; 
} 
/*No emacs use ctrl+x ctrl+s para salvar o arquivo 
e ctrl+x ctrl+q para sair do emacs*/
```

 
2. Cria o arquivo de pré-processamento [opcional] 
g++ -E greenpeace.cpp 

3. Compila o módulo hello (gera o greenpeace.o)
g++ -c greenpeace.cpp

4. Linka o programa e gera o executavel 
g++ -ohello greenpeace.o 

5. Executa o programa 
./greenpeace 


6. Observe que os passos 2,3 e 4 podem ser executados usando:
g++ -v -ogreenpeace greenpeace.cpp

O -v Mostra um conjunto de informações a respeito dos passos da compilação.
Neste exemplo o nome do programa executável é greenpeace e foi especificado com a opção -ogreenpeace.
Se você não especificar um nome, o programa executável se chamará a.out.

Tarefa: Compare o tamanho dos códigos (dos executáveis) gerados com as opções:
g++ greenpeace.cpp #comun
g++ -g2 greenpeace.cpp #com debuger
g++ -o3 greenpeace.cpp #com otimização

Situções: 

Antes de compilar no windows e no linux 
windows nome.h/nome.cpp 
linux nome.h/nome 

Depois de compilar 
windows nome.obj 
linux nome.o 

Depois de linkar 
windows nome.exe 
linux nome 



*Ferramentas para programar no linux* 

_ kylix http://www.borland.com/kylix/index.html. Ambiente com uso da biblioteca VCL (Visual Class Library). 

_ Code Warrior Metroworks, ambiente com uso da biblioteca code warrior (?). 

_ kdevelop http://www.kdevelop.org/ ambiente completo com uso da biblioteca qt ou kde. 

_ qt http://www.trolltech.com, para o desenho de interfaces grficas usando a biblioteca QT. 

_ glade http://glade.gnome.org/ q utiliza o tolkit do gtk++ http://www.gtk.org/. 

_ dev C++ http://www.bloodshed.net/dev/, ambiente visual pequeno e simples de usar, usa as ferramentas da GNU.. 

_ Source navigator http://sources.redhat.com/sourcenav/ . 

_ Sistema GNU (g++, make, automake, autoconf, libtool). Podem-se desenvolver os programas
Com editores de texto simples e usar o make para compilação automatizada. Tem o cvs para controle de versões.
Observe que usar o sistema GNU garante uma maior portabilidade e uniformidade no desenvolvimento de seus programas, pois está presente em praticamente todas as plataformas.


*Quem programa no linux deve saber onde fica o diretório com os programas do sistema e onde ficam localizadas as bibliotecas:* 

/usr/bin 
programas do sistema 

/usr/local/bin 
programas locais 

/usr/include 
arquivos include 

/urs/lib 
bibliotecas 

/usr/openwin/lib 
bibliotecas do X windows 



*Programas ulteis para desenvolvimento de software no linux.* 

Programas utilitrios 
Ambientes de desenvolvimento 
Ambiente para desenvolvimento no KDE = kdevelop 
Ambiente de desenvolvimento semelhante ao Borland = xwpe 
Ambiente para desenvolvimento no GNOME = glade 

Editor de texto 
Editor de texto simples = emacs 


Compiladores
Compilador C da GNU = gcc
Compilador C++ da GNU g++
Compilação automatizada = make
Linkagem = ld 

Depuração
Depurador C da GNU = gdb
Depurador do KDE (kdevelop) = kdbg
Programas GNU = Compliant
Geração dos scripts de configuração = autoconf
Geração dos scripts Makefile = automake
Pacote de geração de bibliotecas = libtool

Programas Diversos
Traça informações, chamadas a bibliotecas = ltrace
Controle de versões CVS

Formatação do código
Diferenças entre arquivos = diff
Formata o código = bison
Organiza o código (layout) = indent
Analisador léxico = fex,fex++

Documentação
Gera documentação a partir de tags no código. = doxygen
Geração de diagramas de classes = graphviz
Manipulação binária = bfd
Binary _le descriptor = binutil
Pro_le (analizador de desempenho) = gprof
Montagem de bibliotecas = ar
Índices das bibliotecas = ranlib
Informações sobre objetos = objdump 


*Veja abaixo algumas extenções que você pode encontrar no GCC :* 

gcc-g77 ( Suporte para Fortran ) 

gcc-gnat (Suporte para Ada ) 

gcc-java (Suporte para Java ) 

gcc-objc (Suporte para Objective-C )

----------


## WhiteTiger

Cara. Posta isso como tutorial. De preferencia no wiki também. O texto está massa.

----------

