Você está na página 1de 6

Desenvolvimento C/C++ no Linux para iniciantes Autor: Pedro Leite pedro.leite@gmail.com 1.

. Introduo Este artigo tem como objetivo fornecer uma configurao modular para o desenvolvimento de aplicaes C/C++ de pequeno a mdio porte no Linux, utilizando make e makedepend, sem que no haja nenhum conhecimento prvio nestas ferramentas. Nenhuma pretenso em explicar minuciosamente as ferramentas citadas ocorre neste artigo. 2. Ambiente O ambiente de desenvolvimento consiste em um editor de textos e algum terminal. O editor ser utilizado para a edio dos arquivos headers e de cdigo fonte e o terminal para a compilao completa da aplicao. Para este artigo, estar sendo utilizado o gedit como editor de textos e o GNOME Terminal para a compilao da aplicao. 3. Configurao Antes de iniciar o desenvolvimento da aplicao, necessrio configurar o ambiente de desenvolvimento. O primeiro passo organizar uma hierarquia de diretrios. A Figura 1 mostra a hierarquia utilizada.

Figura 1: Hierarquia dos diretrios O diretrio bin conter o arquivo executvel da aplicao, que pode ter sido compilado nos modos debug ou release. O diretrio dependencies conter as dependncias de compilao da aplicao. O sub-diretrio include conter os headers necessrios para a compilao e o sub-diretrio lib conter as bibliotecas necessrias para a produo do

Atribuio-Uso No-Comercial-Compatilhamento pela mesma licena 2.5

executvel. O diretrio include conter os headers da aplicao [arquivos .h]. O diretrio obj conter os arquivos intermedirios gerados a partir da compilao, os objetos. O diretrio resources conter os recursos necessrios aplicao, tais como arquivos de configurao, imagens, etc. O diretrio scripts conter os scripts necessrios para compilao, implantao, etc. da aplicao. Nele ficar, por exemplo, o arquivo Makefile, responsvel pelas regras de dependncias. Por fim, o diretrio src conter todo o cdigo fonte da aplicao [arquivos .c ou .cpp]. Aps a configurao dos diretrios, necessrio um breve entendimento das ferramentas make e makedepend. A ferramenta make toma decises sobre quais comandos devem ser executados quando uma dependncia satisfeita. J a ferramenta makedepend calcula tais dependncias entre os headers da aplicao. Por exemplo, se um arquivo A.h inclui o arquivo B.h, ento h uma regra de dependncia entre A e B. Quando o arquivo B.h for alterado, o arquivo A.h dever ser recompilado. O arquivo Makefile conter os comandos a serem realizados para a gerao do executvel, bem como todas as regras de dependncias para a compilao de toda a aplicao. O contedo proposto do arquivo listado a seguir: BINARY_NAME = app ARCH = i686 CC = g++ SRC_EXTENSION = cpp .SUFFIXES = .o .$(SRC_EXTENSION) SOURCES_DIR = $(shell cd ../src && dirs -l) RESOURCES_DIR = $(shell cd ../resources && dirs -l) SCRIPTS_DIR = $(shell cd ../scripts && dirs -l) SOURCES = $(shell cd $(SOURCES_DIR) && ls *.$(SRC_EXTENSION)) CONFIG_NAME = debug MODE = -g OBJECTS = $(SOURCES:.$(SRC_EXTENSION)=.o) OBJECTS_DIR = $(shell cd ../obj/$(CONFIG_NAME) && dirs -l) INCLUDE_DIR = $(shell cd ../include && dirs -l) DEPENDENCIES_DIR = $(shell cd ../dependencies && dirs -l) DEP_INCLUDE_DIR = $(DEPENDENCIES_DIR)/include DEP_LIBRARIES_DIR = $(DEPENDENCIES_DIR)/lib BINARIES_DIR = $(shell cd ../bin/$(CONFIG_NAME) && dirs -l) DEPENDENCIES = $(foreach dep, $(OBJECTS), $(OBJECTS_DIR)/$(dep)) CFLAGS = $(MODE) -Wall -march=$(ARCH) -mtune=$(ARCH) -I$(INCLUDE_DIR) $(DEP_INCLUDE_DIR) LDFLAGS = -L$(DEP_LIBRARIES_DIR) CLEAN_COMMAND = rm -f *.o *~ *.bak $(BINARY_NAME) .$(SRC_EXTENSION).o: $(CC) $(CFLAGS) -c $< -o $@ all: -@ make create-links -@ make $(BINARIES_DIR)/$(BINARY_NAME) -@ make remove-links create-links: -@ $(foreach file, $(SOURCES), $(shell ln -fs $(SOURCES_DIR)/$(file) $(OBJECTS_DIR)/$(file)))

-I

Atribuio-Uso No-Comercial-Compatilhamento pela mesma licena 2.5

remove-links: -@ rm -rf $(OBJECTS_DIR)/*.$(SRC_EXTENSION) $(BINARIES_DIR)/$(BINARY_NAME): $(DEPENDENCIES) $(CC) $(LDFLAGS) $(DEPENDENCIES) -o $(BINARIES_DIR)/$(BINARY_NAME) clean: -@ -@ -@ -@ -@ -@ -@ -@ -@ -@ -@ $(CLEAN_COMMAND) cd ../ && $(CLEAN_COMMAND) cd ../bin/ && $(CLEAN_COMMAND) cd ../bin/debug/ && $(CLEAN_COMMAND) cd ../bin/release/ && $(CLEAN_COMMAND) cd ../obj/debug/ && $(CLEAN_COMMAND) cd ../obj/release/ && $(CLEAN_COMMAND) cd ../src/ && $(CLEAN_COMMAND) cd ../include/ && $(CLEAN_COMMAND) make remove-links CONFIG_NAME=release make remove-links CONFIG_NAME=debug

release: -@ make depend CONFIG_NAME=release -@ make CONFIG_NAME=release MODE=-O3 debug: -@ make depend CONFIG_NAME=debug -@ make CONFIG_NAME=debug MODE=-g depend: -@ cd $(SOURCES_DIR) && makedepend -Y *.$(SRC_EXTENSION) $(INCLUDE_DIR) -p$(OBJECTS_DIR)/ -f$(SCRIPTS_DIR)/Makefile -I

O contedo acima no ser explicado a fundo, porm algumas macros precisam ser alteradas para adequar o Makefile aplicao a ser desenvolvida. Por exemplo, a macro BINARY_NAME conter o nome do executvel da aplicao. A macro ARCH conter a arquitetura para a qual a aplicao ser compilada, por exemplo, i386, i486, i586, i686, pentium4, athlon64, etc. A macro CC indicar qual o compilador a ser utilizado. Caso a aplicao seja escrita em C, gcc deve ser utilizado. Caso seja em C++, g++ deve ser utilizado. A macro SRC_EXTENSION utilizada para indicar a extenso dos cdigos fonte. Se a aplicao for escrita em C, SRC_EXTENSION = c, se a aplicao for escrita em C++, SRC_EXTENSION = cpp. Finalmente, a macro LD_FLAGS indica quais bibliotecas esto sendo utilizadas para gerao do executvel, logo, deve-se complementar a macro com as bibliotecas necessrias, na forma -lNOME_DA_BIBLIOTECA. Por exemplo, -lGL deve ser adicionado, caso a aplicao utilize a biblioteca OpenGL. 4. Desenvolvimento Finalizada a configurao de todo o ambiente de desenvolvimento, necessrio reescrever parte do arquivo Makefile. Por exemplo, para desenvolver uma aplicao OpenGL em C, para a arquitetura i686, utilizando o freeglut como gerenciador de janelas, tem-se a seguinte configurao do arquivo Makefile:

Atribuio-Uso No-Comercial-Compatilhamento pela mesma licena 2.5

BINARY_NAME = openGLApp ARCH = i686 CC = gcc SRC_EXTENSION = c LDFLAGS = -L$(DEP_LIBRARIES_DIR) -lGL -lglut Com o Makefile criado e satisfazendo as condies iniciais da aplicao, o seu desenvolvimento pode ser iniciado. O prximo passo adicionar um arquivo main.c ao diretrio src com o seguinte cdigo: #include <GL/glut.h> void initFunc() { glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); } void reshapeFunc(int width, int height) { float aspect = 0.0f; glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); height = (height == 0 ? 1 : height); aspect = (float) width / (float) height; gluPerspective(45.0f, aspect, 0.01f, 100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void displayFunc() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(2.0f, 2.0f, 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); glLineWidth(2.0f); glColor3f(0.15f, 0.45f, 0.15f); glutWireCube(1.0f); glColor3f(0.5f, 1.0f, 0.5f); glutSolidCube(1.0f); } glutSwapBuffers();

int main(int count, char* args[]) { glutInit(&count, args);

Atribuio-Uso No-Comercial-Compatilhamento pela mesma licena 2.5

glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(800, 600); glutInitWindowPosition(50, 100); glutCreateWindow("OpenGL Cube"); glutReshapeFunc(reshapeFunc); glutDisplayFunc(displayFunc); glutIdleFunc(displayFunc); initFunc(); glutMainLoop(); return 0; } Aps isso, os seguintes comandos podem ser executados: make depend - para que as regras de dependncia sejam criadas, mesmo que nenhum header esteja sendo utilizado. make - para compilar a aplicao e gerar o executvel no modo padro [debug]. make debug - para calcular as dependncias, compilar a aplicao e gerar o executvel em modo debug. make release para calcular as dependncias, compilar a aplicao e gerar o executvel em modo release. make clean - para remover arquivos de backup, arquivos intermedirios e o executvel. Executando-se o comando make release, as dependncias so calculadas, pois internamente uma das dependncias o make depend e logo em seguida o processo de compilao iniciado. O executvel mostrado na Figura 2 gerado no diretrio bin/release.

Figura 2: Executvel gerado Executando-se a aplicao, temos a Figura 3 como resultado.

Atribuio-Uso No-Comercial-Compatilhamento pela mesma licena 2.5

Figura 3: Aplicao OpenGL executando 5. Concluso Aplicaes C/C++ de pequeno a mdio porte que utilizam a hierarquia de diretrios proposta, bem como o arquivo Makefile, podem ser desenvolvidas no Linux por iniciantes, no requerendo que eles possuam conhecimento em ferramentas especficas. O desenvolvimento das aplicaes se torna simples e no burocrtico, requerendo do desenvolvedor que poucas linhas de comando sejam digitadas e executadas.

Atribuio-Uso No-Comercial-Compatilhamento pela mesma licena 2.5

Você também pode gostar