Arquivo da categoria 'C/C++'

Make e Makefile

Postado por Yoshio Iwamoto em 25/11/2009

Você que utiliza algum *nix da vida já deve ter passado pelo momento mágico de ter executado o comando make em algum código fonte, não?

O make (GNU make) é uma ferramenta que executa os comandos inclusos dentro de um arquivo. É normalmente utilizado na compilação e instalação de programas.

Uma das vantagens do make é que ele identifica quais partes do programa devem ser recompiladas de acordo com as mudanças efetuadas desde a última compilação.

Dependendo do tamanho do programa pode-se economizar minutos ou horas entre as recompilações, pois não será necessário recompilar o programa inteiro.

Exemplo de uso:

$ make -f arquivo_com_os_comandos

Se você chamar o comando make sem passar nenhum parâmetro ele tentará utilizar o arquivo com nome de Makefile do diretório atual.

É o que normalmente acontece quando você precisa compilar e instalar um programa pelo código fonte.

  • Descompactar o código fonte (se for um "*.tar.gz").
  • Entrar na pasta descompactada. Haverá um arquivo Makefile dentro.
  • Executar o comando "make" para compilar.
  • Executar o comando "make install" como root para instalar.

Makefile

Se você quiser utilizar o comando make só é necessário criar um arquivo Makefile e dentro dele colocar as instruções que o make deve executar.

Formato do Makefile:

regra: dependências...
	comandos
	...

Os comandos são comandos normais do shell (bash). Pode-se colocar vários comandos, porém devem estar identados com tabulações. Isto é importante, não utilize espaços pois não irá funcionar.

A regra é só um nome para identificar um bloco de comandos. Fazendo uma analogia com programação, a "regra" seria semelhante a uma função.

As dependências são os arquivos necessários para a execução dos comandos da regra, o make irá fazer a verificação deles. Também podem ser outras regras que serão chamadas antes da execução dos comandos. Se houver mais de uma dependência elas devem ser separadas com espaços.

Aqui vai um exemplo de um Makefile que compila um programa em C:

program:
	gcc -o meuprograma meuprograma.c

Um exemplo com dependências:

program: cod1.c cod2.c lib1.a
	gcc -c cod1.c cod2.c
	gcc cod1.o cod2.o lib1.a -o program

lib1.a: lib1.c cod3.c
	gcc -c lib1.c cod3.c
	ar rcs lib1.a lib1.o cod3.o
	ranlib lib1.a

Pode-se utilizar variáveis também. A declaração é simples, mas devem ser chamados com a notação "$(variável)". Repare também que elas podem ser concatenadas:

CC=gcc
CFLAGS=-O2
CFLAGS=$(CFLAGS) -Wall

program:
	$(CC) $(CFLAGS) -o program program.c

Olha que legal no Makefile a seguir, advinha o que acontece ao executar o comando `make clean' no terminal?

program: program.c
        gcc -o program program.c

clean:
        rm *.o
        rm program

O que aconteceria também se houvesse um arquivo no diretório atual que se chamasse "clean"? O `make clean' não iria executar a lista de comandos da regra. Para evitar este tipo de conflito utilize a regra ".PHONY":

program: program.c
        gcc -o program program.c

.PHONY: clean
clean:
        rm *.o
        rm program

Agora a regra "clean" será executada mesmo se houver um arquivo no diretório atual com mesmo nome.

Lendo o valor de um Endereço da memória em C++

Postado por Yoshio Iwamoto em 16/02/2009

Para quem está estudando C++ aqui vai uma dica de como ler o valor de um endereço de memória. Basicamente o que vamos fazer são apenas conversões ou “casts” com os valores numéricos.
Continue Reading »

Internacionalização de software: i18n

Postado por Yoshio Iwamoto em 9/06/2008

Fiquei um tempo sem colocar nada no blog, mas voltei. Recebi até um comunicado oficial do Rafael que se não colocasse nada no blog, era para pegar minhas coisas e passar no RH (ou era para passar no RH e depois pegar as minhas coisas?).

Introdução
Imagine que seu professor de linguagem C++ (ou outra de sua preferência, mas uma linguagem descente, por favor) lhe passe uma lição de casa: “Faça um MMORPG em 5 idiomas diferentes”.
Simples não? Qualquer um faz um MMORPG em C++ da noite para o dia. O detalhe desta simples aplicação é permitir a utilização ou diversão (já que é um game) em outros idiomas.
Se você pensou em um colocar vários “IFs” ou “CASEs” para cada linha que contenha uma string...
Continue Reading »

Sockets em C (WinSock)

Postado por Yoshio Iwamoto em 10/09/2007

Um socket é um mecanismo de comunicação que permite que dois ou mais aplicativos troquem informações, seja no mesmo computador ou em computadores distintos, como os programas de chats, games on-line, navegadores, etc. No geral, programas que utilizam Network Communication ou Interprocess Communication utilizam sockets.

Sockets são importantes, por isso eu tinha que tomar vergonha na cara e aprender a usá-los, comecei a ler sobre o assunto e consegui fazer uma pequena aplicação que envia mensagens para outra.
Continue Reading »

Templates em C++

Postado por Yoshio Iwamoto em 16/07/2007

Uma das coisas mais estranhas do C++ pra mim são os templates, a sua sintaxe não é lá muito intuitiva (mas já vi coisas piores). Mas os templates são importantes, na verdade foram graças aos templates em C++ que a programação genérica se fortaleceu.
Continue Reading »

Como manter o FPS constante

Postado por Yoshio Iwamoto em 26/05/2007

Para quem está programando joguinhos simples em C/C++ usando a API do Windows vou dar (no bom sentido) uma dica sobre como manter o FPS constante e intenso (no bom sentido).

Sem um controle seu jogo irá processar os gráficos na velocidade do processador. Os computadores tem velocidades diferentes e as aplicações não tem um processamento constante e igual, seu jogo poderá rodar a 124 FPS, mas se mexer o mouse irá para 81 FPS, por exemplo.
Continue Reading »

Extendendo Python com cTypes

Postado por Rafael Sierra em 2/02/2007

Esses dias tive que implementar algumas coisas em C, por dois motivos, primeiro eu queria comparar a velocidade da mesma aplicação em duas linguagens (Python e C) e segundo, já estava na hora de começar a usar C com Python ;) .

Os primeiros testes que fiz (com a ajuda do Gean) foi usando a documentação oficial do Python que pode ser encontrada aqui. Foi relativamente fácil e não tive muitos (mais do que nenhum) problemas.

Porém a perfomance não era a esperada, então parti para outros testes, e um desses foi exatamente sobre a biblioteca ctypes. Atualmente ela é um pacote "third-part" (feito por terceiros), porém, será builtin na versão 2.5 :)
Continue Reading »

Av. Conselheiro Nébias, 368A, Cj. 413
Vila Mathias - Santos - SP
Telefone: (13) 3345-4580

© 2008 - 2009 Stiod. Todos os direitos reservados.