programacao orientada a objetos em c - programacao para linux (pt br)

Upload: johnatan-rodrigues

Post on 18-Oct-2015

15 views

Category:

Documents


0 download

TRANSCRIPT

  • LABORATRIO DE MEIOS POROSOS EPROPRIEDADES TERMOFSICAS

    e

    NCLEO DE PESQUISA EM CONSTRUO

    Apostila de Programao Orientada a Objeto em C++Parte V- Programao para Linux

    Andr Duarte Bueno, UFSC-LMPT-NPChttp://www.lmpt.ufsc.br/~andre

    email: [email protected] 0.4.5

    12 de dezembro de 2002

  • Apostila de CVS. Verso 0.4.5Distribuda na forma GFDL (http://www.gnu.org/licenses/licenses.html#TOCFDL).Copyright (C) 2002 - Andr Duarte Bueno.

    Esta apostila textbook livre; voc pode redistribu-la e/ou modific-la sob os termos da LicenaPblica de Documentos da GNU (GFDL), conforme publicada pela Free Software Foundation; verso1.2 da Licena como (a seu critrio) qualquer verso mais nova; preservando as sees no InvariantSections no Front-Cover Texts, and no Back-Cover Texts. Uma cpia da licena localizada nocaptulo GNU Free Documentation License.Esta apostila software livre; voc pode redistribu-la e/ou modific-la sob os termos da Licena Pblica Geral GNU, conforme publicada pela FreeSoftware Foundation; tanto a verso 2 da Licena como (a seu critrio) qualquer verso mais nova.

    Desenvolvida noLaboratrio de Meios Porosos e Propriedades Termofsicas (http://www.lmpt.ufsc.br)e no Ncleo de Pesquisa em Construo (http://www.npc.ufsc.br), com apoio doCurso de Ps-Graduao em Engenharia Mecanica (http://www.posmec.ufsc.br)e da Universidade Federal de Santa Catarina (http://www.ufsc.br).

    1

  • Sumrio

    I Programao Para GNU/Linux, Unix 9

    1 Introduo a Programao GNU/Linux, Unix 101.1 Termos e conceitos utilizados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.2 O bsico do GNU/Linux, Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

    1.2.1 Comandos do shell teis . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.2.2 Expresses regulares3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191.2.3 Programas telnet e ftp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

    1.3 Diretrios teis para programadores . . . . . . . . . . . . . . . . . . . . . . . . . . 221.4 Programas teis para programadores . . . . . . . . . . . . . . . . . . . . . . . . . . 23

    2 Edio de Texto Emacs e VI 252.1 Introduo ao editor emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.2 Comandos do editor emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

    2.2.1 Help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.2.2 Movimento do cursor (use as setas de direo) . . . . . . . . . . . . . . . . 262.2.3 Cut/Copy/Paste/Undo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.2.4 Arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272.2.5 Pesquisa e substituio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272.2.6 Mltiplas janelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272.2.7 Encerrando seo do Emacs . . . . . . . . . . . . . . . . . . . . . . . . . . 27

    2.3 Comandos do editor vi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

    3 Os programas diff, patch, indent 303.1 O programa diff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

    3.1.1 Sentenas para o diff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323.2 O programa patch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323.3 O programa indent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    4 Compilando com gcc, g++ 364.1 Prottipo e parmetros do gcc/g++ . . . . . . . . . . . . . . . . . . . . . . . . . . . 364.2 Arquivos gerados pelo gcc/g++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374.3 Exemplo de uso do gcc/g++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374.4 Sentenas para o compilador da gnu . . . . . . . . . . . . . . . . . . . . . . . . . . 38

    2

  • SUMRIO 3

    5 Make 395.1 Um arquivo de projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395.2 Prottipo e parmetros do make . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395.3 Formato de um arquivo Makefile . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

    5.3.1 Criando variveis em um arquivo Makefile . . . . . . . . . . . . . . . . . . 405.3.2 Criando alvos em um arquivo Makefile . . . . . . . . . . . . . . . . . . . . 41

    5.4 Exemplo de um arquivo Makefile . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415.5 Sentenas para o make . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

    6 Bibliotecas 446.1 Introduo a montagem de bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . 44

    6.1.1 ar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446.1.2 ranlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456.1.3 nm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466.1.4 objdump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476.1.5 ldd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476.1.6 ldconfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

    6.2 Conveno de nomes para bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . 486.3 Bibliotecas usuais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486.4 Montando uma biblioteca esttica (libNome.a) . . . . . . . . . . . . . . . . . . . . . 48

    6.4.1 Usando uma biblioteca esttica . . . . . . . . . . . . . . . . . . . . . . . . . 496.5 Montando uma biblioteca dinmica (libNome.so) . . . . . . . . . . . . . . . . . . . 50

    6.5.1 Usando uma biblioteca dinmica . . . . . . . . . . . . . . . . . . . . . . . . 516.5.2 Vantagens/desvantagens da biblioteca dinmica . . . . . . . . . . . . . . . . 51

    6.6 Sentenas para bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

    7 Libtool 557.1 Introduo ao libtool2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557.2 Forma de uso do libtool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557.3 Criando uma biblioteca sem o libtool . . . . . . . . . . . . . . . . . . . . . . . . . . 567.4 Criando uma biblioteca esttica com o libtool . . . . . . . . . . . . . . . . . . . . . 567.5 Criando uma biblioteca dinmica com o libtool . . . . . . . . . . . . . . . . . . . . 577.6 Linkando executveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577.7 Instalando a biblioteca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577.8 Modos do libtool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587.9 Sentenas para o libtool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

    8 Debug (Depuradores, Debuggers) 608.1 Introduo ao debuger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608.2 Comandos do gbd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608.3 Exemplo de uso do gdb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608.4 Sentenas para o gdb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

    9 Profiler (gprof)2 629.1 Introduo ao gprof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629.2 Sentenas para o profiler: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • SUMRIO 4

    10 Verso de Depurao, Final e de Distribuio 6410.1 Verso debug, release e de distribuio . . . . . . . . . . . . . . . . . . . . . . . . . 64

    10.1.1 Verso debug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6410.1.2 Verso final (release) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6410.1.3 Distribuio dos programas e bibliotecas . . . . . . . . . . . . . . . . . . . 64

    10.2 Sentenas para distribuio de cdigo fonte . . . . . . . . . . . . . . . . . . . . . . 67

    11 Documentao de Programas Usando Ferramentas GNU/Linux 6811.1 Introduo a documentao de programas . . . . . . . . . . . . . . . . . . . . . . . 6811.2 Documentao embutida no cdigo com JAVA_DOC . . . . . . . . . . . . . . . . . 68

    11.2.1 Exemplo de cdigo documentado . . . . . . . . . . . . . . . . . . . . . . . 6811.2.2 Sentenas para documentao java_doc . . . . . . . . . . . . . . . . . . . . 69

    11.3 Tutorial de configurao e uso do DOXYGEN . . . . . . . . . . . . . . . . . . . . . 7011.3.1 Exemplo de programa documentado . . . . . . . . . . . . . . . . . . . . . . 7211.3.2 Exemplo de diagramas gerados pelo doxygen . . . . . . . . . . . . . . . . . 74

    11.4 Documentao profissional com sgml/xml (LYX) . . . . . . . . . . . . . . . . . . . 75

    12 Seqencia de Montagem de Um Programa GNU2 7812.1 Introduo a programao multiplataforma com GNU . . . . . . . . . . . . . . . . . 7812.2 aclocal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8012.3 ifnames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8012.4 autoscan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

    12.4.1 Roteiro do autoscan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8112.5 autoheader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

    12.5.1 Roteiro do autoheader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8112.6 automake . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

    12.6.1 Introduo ao automake . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8212.6.2 Sentenas para o automake . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

    12.7 autoconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8512.7.1 Introduo ao autoconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8512.7.2 Prottipo do autoconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8612.7.3 Roteiro do autoconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8612.7.4 Estrutura de um arquivo configure.in . . . . . . . . . . . . . . . . . . . . . . 8612.7.5 Exemplo de um arquivo configure.in . . . . . . . . . . . . . . . . . . . . . . 8712.7.6 Macros do autoconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8712.7.7 Como aproveitar os resultados das pesquisas realizadas pelo

    autoconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9012.7.8 Variveis definidas no arquivo configure.in e que sero substitudas no ar-

    quivo Makefile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9212.8 autoreconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9312.9 ./configure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9412.10Como incluir instrues do libtool em seu pacote gnu . . . . . . . . . . . . . . . . . 94

    12.10.1 Exemplo de arquivo makefile.am usando o libtool . . . . . . . . . . . . . . . 9512.10.2 Exemplo de arquivo configure.in usando o libtool . . . . . . . . . . . . . . . 95

    12.11Exemplo Completo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • SUMRIO 5

    13 Introduo ao Controle de Verses Com o CVS 10013.1 O que o CVS? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10013.2 Comandos do cvs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10113.3 Seqencia de trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

    13.3.1 Roteiro para criar um repositrio . . . . . . . . . . . . . . . . . . . . . . . 10313.3.2 Para importar os arquivos de seu projeto antigo para dentro do repositrio . . 10413.3.3 Para baixar o projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10513.3.4 Para criar mdulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10613.3.5 Para adicionar/remover arquivos e diretrios . . . . . . . . . . . . . . . . . . 10713.3.6 Para atualizar os arquivos locais . . . . . . . . . . . . . . . . . . . . . . . . 110

    13.4 Verses, tags e releases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11113.4.1 Entendendo as verses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11113.4.2 Para criar tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11113.4.3 Para criar releases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11313.4.4 Recuperando mdulos e arquivos . . . . . . . . . . . . . . . . . . . . . . . 114

    13.5 Para verificar diferenas entre arquivos . . . . . . . . . . . . . . . . . . . . . . . . . 11513.6 Verificando o estado do repositrio . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

    13.6.1 Histrico das alteraes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11613.6.2 Mensagens de log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11613.6.3 Anotaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11713.6.4 Verificando o status dos arquivos . . . . . . . . . . . . . . . . . . . . . . . . 117

    13.7 Ramos e Misturas (Branching and Merging) . . . . . . . . . . . . . . . . . . . . . . 11813.7.1 Trabalhando com ramos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11813.7.2 Mesclando 2 verses de um arquivo . . . . . . . . . . . . . . . . . . . . . . 11913.7.3 Mesclando o ramo de trabalho com o ramo principal . . . . . . . . . . . . . 119

    13.8 Configurao do cvs no sistema cliente-servidor3 . . . . . . . . . . . . . . . . . . . 12013.8.1 Variveis de ambiente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

    13.9 Como baixar programas de terceiros usando o cvs . . . . . . . . . . . . . . . . . . . 12113.10Frontends . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12113.11Sentenas para o cvs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12113.12Um diagrama com os comandos do cvs . . . . . . . . . . . . . . . . . . . . . . . . 124

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • Lista de Figuras

    2.1 O editor de texto emacs (observe o tem de menu C++). . . . . . . . . . . . . . . . . 2911.1 Ilustrao da hierarquia TMatriz da biblioteca LIB_LMPT. . . . . . . . . . . . . . . 7411.2 Ilustrao da hierarquia da classe TRotulador3D da biblioteca LIB_LMPT. . . . . . . 7511.3 Ilustrao das dependncias do arquivo TRotulador3D. . . . . . . . . . . . . . . . . 7611.4 O site do LYX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

    13.1 Verses de um arquivo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11113.2 Criando um tag. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11213.3 Criando um release. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11313.4 Como ficam os ramos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11813.5 Um frontend para o cvs no GNU/Linux, Unix (o cervisia). . . . . . . . . . . . . . . 12213.6 Um frontend para o cvs no Windows. . . . . . . . . . . . . . . . . . . . . . . . . . 12313.7 Diagrama com os comandos do cvs. . . . . . . . . . . . . . . . . . . . . . . . . . . 124

    6

  • Lista de Tabelas

    1.1 Diretrios importantes para o programador. . . . . . . . . . . . . . . . . . . . . . . 221.2 Programas teis para desenvolvedores de software no ambiente GNU/Linux. . . . . . 24

    6.1 Bibliotecas usuais. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

    8.1 Comandos do gdb. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

    12.1 Sequncia executada pelo programador para montagem de programas multi-plataformausando o padro GNU. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

    12.2 Sequncia executada pelo usurio. . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

    7

  • Listings

    3.1 Arquivo e06a-hello.cpp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303.2 Arquivo e06b-hello.cpp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313.3 Arquivo diff. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313.4 Arquivo diff -c. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313.5 Arquivo diff -u. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323.6 Arquivo ex-vector-1-indent.cpp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345.1 Arquivo makefile. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415.2 Exemplo de uso do programa make. . . . . . . . . . . . . . . . . . . . . . . . . . . 426.1 Sada do comando ar - -help. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456.2 Sada do comando nm help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466.3 Sada do comando ldd /usr/bin/lyx. . . . . . . . . . . . . . . . . . . . . . . . . . . . 476.4 Arquivo makefile com bibliotecas estticas e dinmicas. . . . . . . . . . . . . . . . . 516.5 Arquivo mostrando o uso do makefile. . . . . . . . . . . . . . . . . . . . . . . . . . 537.1 Arquivo libtool - -help. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5511.1 Exemplo de arquivo de configurao do doxygen com comentrios. . . . . . . . . . 7111.2 Sada do comando doxygen - -help. . . . . . . . . . . . . . . . . . . . . . . . . . . 7211.3 Exemplo de cdigo documentado no formato JAVA_DOC para uso com o programa

    doxygem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7213.1 Sada do comando: cvs - -help-options . . . . . . . . . . . . . . . . . . . . . . . . . 10113.2 Sada do comando: cvs - -help-commands . . . . . . . . . . . . . . . . . . . . . . . 10113.3 Sada do comando: cvs- -help-synonyms . . . . . . . . . . . . . . . . . . . . . . . . 10213.4 Sada do comando: cvs import . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10413.5 Como fica o repositorio aps a importao . . . . . . . . . . . . . . . . . . . . . . . 10513.6 Sada do comando: cvs -H checkout . . . . . . . . . . . . . . . . . . . . . . . . . . 10513.7 Sada do comando: cvs -H commit . . . . . . . . . . . . . . . . . . . . . . . . . . . 10713.8 Sada do comando cvs commit aps adio de um mdulo . . . . . . . . . . . . . . 10713.9 Sada do comando: cvs -H update . . . . . . . . . . . . . . . . . . . . . . . . . . . 11013.10Sada do comando: cvs -tag nome . . . . . . . . . . . . . . . . . . . . . . . . . . . 11213.11Sada do comando: cvs commit -r 2 . . . . . . . . . . . . . . . . . . . . . . . . . . 11413.12Sada do comando: cvs-diff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11513.13Sada do comando: cvs -log leiame.txt . . . . . . . . . . . . . . . . . . . . . . . . . 11613.14Sada do comando: cvs -status leiame.txt . . . . . . . . . . . . . . . . . . . . . . . . 117Lista de programas

    8

  • Parte I

    Programao Para GNU/Linux, Unix

    9

  • Captulo 1

    Introduo a Programao GNU/Linux, Unix

    Esta parte da apostila contm dicas e instrues para montagem de programas usando o formatomultiplataforma da GNU. Inicialmente apresenta-se uma lista de comandos do shell e de programasteis no ambiente GNU/Linux. Descreve-se o programa, sua utilidade, os arquivos de configurao eos parmetros opcionais. Quando conveniente apresenta-se um exemplo.

    A seguir descreve-se o uso dos editores emacs e vi, e os programas diff, patch e indent. Descreve-se o compilador gcc/g++ e o make para montagem de programas pequenos. Como montar bibliotecas,o uso do debuger e do profiler, como distribuir seu cdigo, como documentar seus programas.

    Depois, apresenta-se um roteiro para montar programas completos usando o padro GNU.

    O texto aqui apresentado um texto introdutrio. Um texto intermedirio, que abrange diversos aspectos da programao para GNU/Linux (fer-

    ramentas da gnu, processos, sinais, device drives, programao em ambientes grficos) en-contrado no livro Linux Programming Unleashed de Kurt Wall et al. Em portugus existe oProgramando com Ferramentas GNU (editado pela conectiva).

    Textos avanados so os manuais disponibilizados na internet, isto , para aprender em detalheso autoconf, baixe o manual do autoconf, o mesmo vlido para os demais tpicos apresentadosnesta apostila.

    Este resumo tem como base as pginas man e os manuais pblicos do make (3.78), egcs (1.1.2),egcs++ (1.1.2), aucotonf (2.13), automake (1.4), libttol1, o manual do doxygen e artigos da revista doGNU/Linux (http://www.revistadolinux.com.br). Tambm foram consultadas as referncias[13, 9, 12, 11, 3][2, 10, 1, 4][8][7, 5].

    1Estes manuais so encontrados, em ingls, no site da gnu (http://www.gnu.org).

    10

  • CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX 11

    1.1 Termos e conceitos utilizados2

    Apresenta-se aqui, brevemente, uma explicao dos termos utilizados no mundo do software livre.

    Linux: clone livre do kernel do UNIX, escrito a partir do zero por Linus Torvalds, com a ajuda deum grupo de programadores espalhados pela internet [isto , o linux somente um KERNEL].Foi projetado para estar em conformidade com o POSIX e com a Single Unix Specification.

    GNU: acrnimo para GNU no UNIX. GNU o nome de um sistema operacional completo ecompatvel com UNIX escrito a partir de 1983 por Richard Stallman e inmeros hackers dacomunidade de software livre espalhados pela internet. O GNU um sistema 100% livre, ouseja, ele fornece as 4 liberdades bsicas do software livre: A liberdade de uso, modificao,cpia e publicao de verses modificadas.

    GNU/Linux: sistema operacional GNU 100% livre que utiliza o Linux como kernel. GNU/Linux a variante mais conhecida do sistema GNU.

    GPL: licena de software livre mais utilizada no mundo. A caracterstica que qualquer trabalho de-rivado de um software livre sob GPL, obrigatoriamente deve permanecer livre. A GPL pode serobtida em http://www.gnu.org/licenses/gpl.html, uma cpia apresentada no apndice??.

    Cdigo Aberto: expresso utilizada para indicar que voc pode ver o cdigo fonte do programa.Entretanto, nada pode ser dito a respeito das condies sob as quais o cdigo fonte se encontra.Existem programas de cdigo aberto que no so livres pois o usurio, dependendo da licena,pode ser proibido de alterar e publicar o cdigo.

    Open Source Initiative: grupo desmembrado do movimento pelo software livre em 1998 e querejeita a luta pela liberdade no uso do software. Seu objetivo disseminar a idia de que ocdigo fonte esteja disponvel e que as modificaes sejam permitidas gerando assim programasmelhores. Apesar disto este grupo costuma recomendar o uso da licena GPL, que representamelhor o esprito do software livre. Isto torna os dois grupos cooperativos do ponto de vista decriao de softwares.

    Software Livre: Software que garante ao usurio plenas liberdades de uso, modificao, cpia epublicao de verses modificadas. A definio de software livre pode ser encontrada em:http://www.gnu.org/philosophy/free-sw.html.

    Movimento pelo Software Livre: Movimento surgido na dcada de 70 em conseqncia da cres-cente presso recebida para a adoo de softwares proprietrios e assinaturas de tratados deno-divulgao. O movimento ganhou forca a partir da dcada de 80 com o projeto GNU quelibertava os usurios dos sistemas UNIX proprietrios. O GNU consolidou-se na dcada de90 como um sistema completo e funcional atingindo uma qualidade tcnica comparvel aosmelhores sistemas operacionais proprietrios.

    Em resumo, Linux um kernel e no um sistema operacional. Apesar de Linux ser comumenteusado em referncia ao sistema operacional GNU/Linux voc deve evitar este uso equivocado por

    2Contribuio do revisor Ricardo Grutzmacher ([email protected]).

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX 12

    questes de clareza tcnica e por questes de crdito ao projeto GNU que forneceu o seu sistemaoperacional para ser adaptado ao kernel Linux. Sempre que voc quiser falar do sistema operacionaluse o termo GNU/Linux. Desta forma voc estar levando adiante os ideais do software livre queesto representados no projeto GNU.

    1.2 O bsico do GNU/Linux, UnixApresenta-se a seguir um guia com alguns comandos de shell do GNU/Linux, Unix, MacOS X, e

    que so teis para programadores.

    1.2.1 Comandos do shell teis3

    Lista-se a seguir alguns comandos de shell teis para programadores. Uma descrio mais de-talhada dos mesmo pode ser encontrada em apostilas/livros sobre o GNU/Linux, Unix. Voc podeobter informaes simplificadas sobre estes comandos usando o programa man (de manual). Use ocomando man nomeDoPrograma para ver um manual simples do programa. Verses mais atuali-zadas dos manuais destes programas so obtidos com info nomeDoPrograma. Voc tambm podeobter um help resumido usando nomeDoPrograma - -help.

    Nos exemplos apresentados a seguir, os comentrios aps o sinal # no devem ser digitados. Sevoc j um usurio experiente do GNU/Linux pode pular esta parte.

    Diretrios. Diretrio atual... Diretrio pai (Ex: cd ..).~ Diretrio HOME do usurio (Ex: cd ~).

    cd Muda diretrio corrente

    cd /home/philippi #Caminho completocd ../../usr #Caminho relativocd - #Alterna para diretrio anterior

    pwd Mostra a path do diretrio corrente.

    ls Lista o contedo do diretrio.

    -l Lista detalhada.-a Mostra executvel e ocultos.-b Nmero de links do arquivo.-m Mostra tudo em uma linha.-F Mostra \ dos diretrios.-x Mostra em colunas.

    3Uma excelente apostila de referncia sobre o GNU/Linux encontrada em http://www.cipsga.org.br.

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX 13

    ls -F | egrep / #mostra diretrios

    tree Lista em rvore.

    tree -d #Lista somente os diretrios

    mkdir Cria diretrio.

    mkdir testmkdir d1 d2 #Cria diretrios d1 e d2mkdir d1/d2 #Cria d1 e o filho d2mkdir -p d3/d31/d32 #Cria os diretrios d3 d3/d31 d3/d31/d32

    mvdir Move ou renomeia um diretrio.

    rmdir Remove o diretrio.

    -R #Recursivo, elimina subdiretrios (usar com cuidado).

    rmdir -p d3/d31/d32 #Remove todos os diretriosrm -R diretorio #Remove o diretrio e seus sub-diretrios

    Arquivos

    cp a1 a2 Cpia arquivos e diretrios.

    -b Cria backup de a2.-i Copia iterativa.-r Cpia recursiva.-P Cpia arquivo e estrutura de diretrio.-p Preserva as permisses e horas.-v Modo verbose.-b Cria backup.

    cp a1 a2

    mv Move arquivos (renomeia arquivos).

    -b Cria backup.-v Modo verbose.-i Iterativa.

    mv a1 a2 #Renomeia arq a1 para a2mv d1 d2 #Renomeia dir d1 para d2mv -b a1 a2 #Renomeia com backup

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX 14

    rm Remove arquivos (retira links).

    -d Remove diretrio.-i Remove iterativamente.-r Remove diretrios recursivamente.-f Desconsidera confirmao.

    #S execute o comando abaixo em um subdiretrio sem importnciarm -f -r * #Remove tudo (*) sem pedir confirmao

    ln Linka arquivos e diretrios (um arquivo com link s deletado se for o ltimo link).

    ln -f chap1 introln origem link #Cria link permanenteln -s origem link #Cria link simblico

    find O find usado para pesquisar arquivos em seu HD.

    find path expresso-name Informa o nome do arquivo.-print Mostra a path.-type Informa o tipo.-atime Informa dados de data.-size Informa tamanho(+ ou -).-o Aceita repetio de parmetro (Other).-xdev Desconsidera arquivos NFS.-exec [comando [opcoes]] Permite executar comando.

    #Para achar arquivos core:find / -name core#Para localizar arquivos do usurio:find PATH -USER nomeUsurio#Para localizar arquivos *.cpp:find PATH -name *.cpp#Para localizar e remover arquivos .o:find PATH -name *.o | xargs rm#Localizando tudo com a extenso *.o e *.afind -name *.o-o -name *.a#PS: exec s funciona com alguns programas, melhor usar xargs.find -type f -atime +100 -printfind . -size +1000kfind ~/ -size -100kfind [a-c]????find file[12]

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX 15

    head n Mostrar as primeiras n linhas de um arquivo.

    head -5 nome.txt

    tail n Exibe arquivo a partir de uma linha.

    tail -20 nome.txt

    nl Nmero de linhas do arquivo.

    wc Nmero de linhas, de palavras e de bytes do arquivo.

    cat arq1 Mostra contedo do arquivo arq1.

    cat a1 a2 Mostra arquivos a1 e depois a2

    cat -n a2 Mostra contedo de a2 com numerao

    cat f1 #Mostra arquivo f1#Cria novo arquivo:

    cat > texto.txt...digita o texto...contrl+d #Finaliza arquivocat a1 a2 > a3 #Concatena a1 e a2 e armazena em a3cat a > > b #Acrescenta ao final do arquivo b o arquivo als -la | cat -n

    less arq Mostra contedo do arquivo (+completo)

    #/str para localizar a string str no texto visualizadoless arq #q para sair

    file arq Informa o tipo de arquivo.

    file *file * | egrep directory

    tr Converte cadeias de caracteres em arquivos.

    ls | tr a-z A-Z #de minsculas para maisculas

    xargs Facilita passagem de parmetros para outro comando.xargs [opes][comando [opes]]

    #Procura e deleta arquivos *.cpp

    find /tmp -name "*.cpp" | xargs rm

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX 16

    Pesquisa dentro de arquivos

    grep O grep usado para pesquisar o que tem dentro de um arquivo.

    -n Mostra nmero da linha.-F O grep funciona como o fgrep.-c Retorna nmero de coincidncias.-i Desconsidera maisculas/minsculas.-s Desconsidera mensagens de erro.-v Modo verbose.-A n Lista tambm as n linhas posteriores.-B n Lista tambm as n linhas anteriores.-r Ordem inversa.-f Usa arquivo auxiliar.

    man grep #Mostra detalhes do grepgreep -v buble sort.cls -l | egrep "Julia" #Lista diretrio e pesquisa pelo arquivo julials -la | egrep "Sofia"grep ^[0-9] guide.txtgrep "(b)" guide.txtgrep arqAux guide.txt # Pesquisa em guide.txt usando arqAux

    sort Ordena arquivos.

    -c Verifica arquivo.-o Especifica nome arquivo sada.-d Ordem dicionrio.-f Despreza diferena maiscula/minscula.-t Atualiza data e hora.-s Modo silencioso.

    sort -r arquivols | sort -r #Ordem invertida#Ordena a listagem de diretrio a partir da 4 coluna,considerando nmerols -l |egrep rwx | sort +4n

    Compactao e backup

    zip Compatvel com pkzip/pkunzip do DOS.

    unzip Unzipa arquivos zip.

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX 17

    zip -r nome.zip nomeDiretriounzip nome.zip

    gzip / gunzip Compacta/Descompacta arquivos com a extenso: gz,.Z,-gz,.z,-z

    -c Mostra arquivo na tela.-d Descomprime o arquivo.-S Extenso do arquivo.-f Fora compresso.-l Lista arquivos.-r Mostra diretrios recursivamente.-t Testa integridade do arquivo.-v Modo verbose.-1 Mais veloz e menos compactado.-9 Mais lento e mais compactado.

    #Para compactar todo um diretriotar -cvf nomeDiretorio.tar nomeDiretoriogzip nomeDiretorio.tar#Para descompactargunzip nomeDiretorio.tar.gztar -xvf nomeDiretorio.tar

    bzip2 Compactador mais eficiente que o gzip.

    bunzip2 Descompacta arquivos bz2.

    bzip2recover Recupera arquivos bz2 extragados.

    -t Testa-v Modo verbose

    bz2cat Descompacata para tela (stdout).lha Cria e expande arquivos lharc.

    unarj Descompacta arquivos arj.split til para copiar um arquivo grande para disquetes.

    Gera os arquivos xaa,xab,xac,... Veja man split.

    #Dividir um arquivo de 10mb em disketes de 1.44mb:split -b 1440kb nomeArquivoGrande.doc#Para recuperar use o cat:cat xaa xab xac > nomeArquivoGrande.doc

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX 18

    tar O tar permite a voc agrupar um conjunto de arquivos em um nico, facilitando o backup (ou oenvio pela internet). Pode-se ainda compactar os arquivos agrupados com o gzip.-c Cria novo arquivo.-v Modo verbose.-z Descompacta arquivos (*.tar.gz).-f NomeArquivo.-w Modo iterativo.-r Acrescenta no modo apende.-x Extrai arquivos.-A Concatena arquivos.-d Compara diferenas entre arquivos.- -delete Deleta arquivos.-t Lista o contedo do arquivo.-u Atualiza o arquivo.-N Aps a data tal.-o Extrai arquivos para monitor.-w Iterativa.-C Muda o diretrio.-G Backup incremental.

    #Empacotando origem em destinotar -cf origem > destino.tar#Empacotando e j compactandotar -cvzf destino.tar.gz origem#Desempacotandotar -xf nome.tartar -xzvf nome.tgztar -xzvf nome.tar.gztar -xvwf nome.tar#Backup completo no dispositivo /dev/fd0tar cvfzM /dev/fd0 / #Backuptar xvfzM /dev/fd0 #Restaurao

    Diversos

    [*] Metacaracter.[?] Caracter coringa.clear Limpa a tela.

    date Mostra data e hora.

    date -s 8:50 #Acerta hora para 8:50

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX 19

    1.2.2 Expresses regulares3

    Alguns programas do GNU/Linux aceitam o uso de expresses regulares (principalmente os daGNU). O uso de expresses regulares til nas pesquisas de arquivos com find, no uso do emacs,entre outros.

    Alguns caracteres so usados para passar parmetros para o interpretador das expresses regulares,para us-los na pesquisa, deve-se preceder o caracter com /.

    Veja abaixo alguns exemplos de expresses regulares.[xyz] Qualquer das letras dentro do colchete.[^xy] Exceto x e y.

    [t-z] De t at z (tuvwxyz).[a-zA-Z] Qualquer letra.[0-9] Qualquer nmero.^ No incio do pargrafo.

    $ No fim do pargrafo.

    \< No incio da palavra.

    \ No fim da palavra.

    \>search Palavra que termina com search.

    z* Letra z, 0 ou mais vezes: z,zz,zzz,zzzz,...

    Z+ Letra Z, 1 ou mais vezes.

    A? Letra A pode ou no fazer parte.

    revistas? revista ou revistas.

    A{m} Letra A m vezes.[0-9]{3} Nmero de 3 dgitos.Z{3,5} Letra Z de 3 a 5 repeties zzz,zzzz,zzzzzK{,7} At 7 repeties de K.K{3,} No mnimo 3 repeties de K.{0,} O mesmo que *.{1,} O mesmo que +.{0,1} O mesmo que ?.() Usado para deixar a expresso mais clara (precedncias).

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX 20

    Linux-(6|6.1|6.2), Acha Linux-6, Linux-6.1, Linux-6.2.O uso de () cria variveis internas que podem ser acessadas como nos exemplos abaixo:

    (quero)-\1 = quero-quero.

    ([a-zA-Z]\1 Qualquer letra espao qualquer letra.

    . Qualquer caracter. Se estiver no meio de uma sentena use \.

    \w Qualquer letra.

    \W Nenhuma letra.

    | Pipe (tubo).

    Converso de wildcard (dos), para expresso regular.

    *.txt *\.txt.

    arq.cpp Arq\.cpp.

    arq?.cpp Arq.\.cpp.

    Cap[1-7].lyx Cap[1-7]\.lyx.

    arq{a,b} arq(a|b).

    Exemplo:

    var=Avancado Define varivel var, cujo contedo o diretrio Avancado.Para usar uma varivel definida use $var.

    ls var No aceita (ls: var: Arquivo ou diretrio no encontrado).ls $var Mostra o contedo de var, do diretrio Avancado.ls var No aceita aspas simples.ls "echo $var" No interpreta contedo de aspas duplas.ls echo $var Interpreta o contedo que esta dentro da crase.

    for i in *.html; do mv $i $i.old ; done

    1.2.3 Programas telnet e ftpApresenta-se a seguir os principais comandos dos programas telnet e ftp. Atualmente o telnet e

    o ftp esto sendo substituidos pelo ssh. O ssh um secure shell, permitindo acessar, copiar e pegararquivos de mquinas remotas. Isto , o ssh funciona como o telnet e o ftp, mas com segurana.

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX 21

    telnet

    O telnet um programa que executado em seu computador e o conecta a outros computadoresem qualquer lugar do mundo. como se voc estivesse executando os programas do computadorremoto de dentro de seu computador.

    Comando Descrio.

    ? Lista os comandos.

    open Conecta com um computador remoto.

    display Mostra os parmetros da operao.

    mode Modo linha a linha ou caracter a caracter.

    Set,unset Seta os parmetros de operao.

    send Transmitir caracteres especiais.

    status Informaes de estatus.

    Contrl +z Suspende o telnet, chama o shell.

    fg Retorna do shell para o telnet. Volta para o ltimo programa em operao.

    logout Encerra conexo avisando.

    close Fecha a conexo corrente.

    quit Encerra o telnet.

    ftp

    O ftp precisa de 2 computadores, um cliente e outro servidor. O programa ftp cliente executadoem seu computador e o programa ftp servidor em um computador remoto. O cliente envia comandos(como listar diretrios) para o servidor, o servidor responde (mostrando o diretrio).

    Depois de localizado o arquivo (que voc deseja baixar), o mesmo pode ser obtido com o comandoget nome_do_arquivo. Com quit voc encerra a conexo ftp.

    help Lista de todos os comandos ftp.

    ! Pausa o ftp e inicia o shell.

    ! comando Executa um comando do shell.

    Conectando

    open h Inicia conexo com host h.

    user Define usurio.

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX 22

    ascii Transferncia de arquivo no formato ascii.

    binary Transferncia de arquivo no formato binrio.

    hash yes/no Mostra o # do arquivo transferido.

    prompt yes/no Aguarda resposta para transferncia de mltiplos arquivos.

    status Exibe configurao atual.

    get Puxa o arquivo para seu computador.

    mget Puxa diversos arquivos.

    send Envia um arquivo (ou put, ou mput).cd nome Muda o diretrio.

    cdup Diretrio pai.

    dir ou ls Mostra diretrio com detalhes.

    lcd Muda diretrio local.

    pwd Mostra a path corrente.

    quit Encerra a conexo.

    close Encerra conexo.

    Agora voc j conhece os comandos e programas mais utilizados em um terminal do GNU/Linux.Podendo navegar, criar, deletar e mover diretrios. Procurar e visualizar o contedo de arquivos.

    Como dito anteriormente, voc pode consultar o manual de sua distribuio para obter maioresinformaes sobre estes comandos.

    1.3 Diretrios teis para programadoresQuem programa no GNU/Linux precisa saber onde esto o diretrio com os programas do sistema,

    o diretrio onde so instalados os programas e onde esto as bibliotecas. Veja na Tabela ?? algunsdestes diretrios.

    Tabela 1.1: Diretrios importantes para o programador.

    Diretrio Descrio/usr/bin Programas do sistema.

    /usr/local/bin Programas locais esto aqui./usr/include Arquivos include

    /usr/lib Bibliotecas/usr/openwin/lib Bibliotecas do X window

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX 23

    1.4 Programas teis para programadoresApresenta-se na Tabela ?? uma lista de programas teis usados no desenvolvimento de programas

    no GNU/Linux. Estes programas sero detalhados posteriormente.

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX 24

    Tabela 1.2: Programas teis para desenvolvedores de software no ambiente GNU/Linux.

    Programas utilitriosAmbientes de desenvolvimento

    Ambiente para desenvolvimento no KDE kdevelopAmbiente de desenvolvimento semelhante ao Borland xwpe

    Ambiente para desenvolvimento no GNOME gladeEditor de texto

    Editor de texto simples emacsCompiladores

    Compilador C da GNU gccCompilador C++ da GNU g++Compilao automatizada make

    Linkagem ldDepurao

    Depurador C da GNU gdbDepurador do KDE (kdevelop) kdbgProgramas GNU Compliant

    Gerao dos scripts de configurao autoconfGerao dos scripts Makefile automake

    Pacote de gerao de bibliotecas libtoolProgramas Diversos

    Traa informaes, chamadas a bibliotecas ltraceControle de verses CVS

    Formatao do cdigoDiferenas entre arquivos diff

    Formata o cdigo bisonOrganiza o cdigo (layout) indent

    Analisador lxico flex,flex++Documentao

    Gera documentao a partir de tags no cdigo. doxygenGerao de diagramas de classes graphviz

    Manipulao binria bfdBinary file descriptor binutil

    Profile (analizador de desempenho) gprofMontagem de bibliotecas ar

    ndices das bibliotecas ranlibInformaes sobre objetos objdump

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • Captulo 2

    Edio de Texto Emacs e VI

    Apresenta-se neste captulo uma breve descrio dos comandos dos editores emacs e vi.

    2.1 Introduo ao editor emacsO emacs, ilustrado na Figura ?? um bom editor de texto. O emacs oferece um conjunto de

    funes especficas para o desenvolvimento de seus programas em C++.Ao salvar o arquivo com a extenso *.h ou *.cpp, automaticamente o emacs mostra a sintaxe de

    C++ atravs do syntax-highlight, isto , o texto aparece colorido.Para maiores informaes sobre o emacs procure no http://www.altavista.com por emacs

    programming.Se voc gosta de outros editores de texto, no tem problema. Use o que voc conhece.Os principais comandos de um editor de texto so os famosos cut (ctrl+w), copy (alt+w) e past (ctrl+y).

    O undo (ctrl+x+u), o search (ctrl+s+palavra), e o comando para salvar o arquivo (ctrl+x ctrl+s) e fechar oprograma (ctrl+x ctrl+c). Apresenta-se nas sees que seguem os principais comandos do editor emacs.

    2.2 Comandos do editor emacsLista-se a seguir, de forma resumida os principais comandos do emacs. A letra ^ representa o

    CTRL.

    2.2.1 Help^+h n Emacs news.

    ^h i Info.

    ^h m Modo de descrio.

    ^h a Comando apropos.

    ^h t Emacs tutorial.

    ^h f Descrio da funo.

    25

  • CAPTULO 2. EDIO DE TEXTO EMACS E VI 26

    ^-x Acesso a funo de um nico caracter.

    Alt-x Acesso a comando de uma palavra.

    2.2.2 Movimento do cursor (use as setas de direo)Alt+< Inicio do arquivo.

    Home Inicio do arquivo.

    pageUp Inicio da pgina.

    ^p Incio do pargrafo.

    ^b ^f Linhas.

    ^a ^e Fim do pargrafo.

    Alt+b Alt+f Palavras.

    Alt+> Fim do arquivo.

    pageDown Fim da pgina.

    End Fim do arquivo.

    2.2.3 Cut/Copy/Paste/UndoAlt+w Copy.

    ^w Cut.

    ^y Paste.

    ^x u Undo.

    ^_ Undo.

    Alt+y Paste sucessivo.

    ^d Apaga a letra a direita.

    del Apaga a letra a esquerda.

    Alt+d Apaga a palavra a direita.

    Alt+del Apaga a palavra a esquerda.

    ^k Apaga toda a linha a direita.

    Alt+k Apaga toda a linha a direita inclusive retorno de carro.

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 2. EDIO DE TEXTO EMACS E VI 27

    2.2.4 Arquivos^x ^f Abre um arquivo do disco ou cria novo.

    ^x ^d Abre o diretrio.

    ^x ^s Salva o arquivo em disco.

    ^x ^w Salvar como.

    ^x ^d Abre um diretrio.

    ^x 1 Uma janela.^x 2 Duas Janelas.

    ^x i Inserir o arquivo.

    ^x ^b Lista os buffers.

    2.2.5 Pesquisa e substituioAlt+% Entre com a string A

    Entre com a string B #Pede confirmao

    Alt+x repl sEntre com a string AEntre com a string B #No pede confirmao

    Pesquisa

    ^s palavra Procura pela palavra (para baixo).

    ^r palavra Procura pela palavra (para cima).

    2.2.6 Mltiplas janelas^u 0^] Posiciona no inicio da janela^mv Scroll para final da janela^xo Alterna janela ativa^x2 Duas janelas^x1 Uma janela ativa

    2.2.7 Encerrando seo do Emacs^x ^c Sai do Emacs.

    ^z Suspende o Emacs.

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 2. EDIO DE TEXTO EMACS E VI 28

    Sentenas para o emacs

    AUTO SAVE: O emacs salva automaticamente os arquivos em disco com o nome:"#nomeArquivo#.Quando voc salva o arquivo em disco deixa de existir o autoSave.

    A Linha de informaes mostra: O nome do arquivo, a linha, a percentagem

    2.3 Comandos do editor viEditor de texto simples e eficiente.

    :w Salva arquivo em disco.

    :q Para sair.

    :q! Sai mesmo que o arquivo tenha sido alterado.

    :e Edita outro arquivo.

    :!com Executa comando do shell.

    :r arq L outro arquivo na posio do cursor.

    Exemplo:vi arquivo #Edita o arquivoman vi #Maiores informaes sobre o vi

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 2. EDIO DE TEXTO EMACS E VI 29

    Figura 2.1: O editor de texto emacs (observe o tem de menu C++).

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • Captulo 3

    Os programas diff, patch, indent

    Apresenta-se neste captulo uma breve introduo aos programas diff, patch e indent. Este captulopode ser lido mais tarde sem perda de seqencia.

    3.1 O programa diffO programa diff usado para mostrar as diferenas entre 2 arquivos, isto , compara dois arquivos

    linha a linha.O programa diff muito til, o mesmo usado para comparar verses de um mesmo arquivo (veja

    Captulo ??) e para gerar arquivos de patch (veja seo ??).

    Prottipo e parmetros do diff:diff [opes] Arq1 Arq2

    -b Ignora espaos em branco.-c Gera sada mostrando os 2 arquivos e as diferenas.-i Ignora diferenas entre maisculas e minsculas.-q Apenas informa se os arquivos so iguais ou diferentes.-r Compara diretrios recursivamente.-v Mostra verso do diff.-xpattern Quando compara diretrios, considerar arquivos com a extenso pattern.-u Formato unificado (+ claro).

    Veja a seguir o arquivo e06a-hello.cpp, um programa simples em C++.Listing 3.1: Arquivo e06a-hello.cpp.

    #include

    int main(){

    std::cout

  • CAPTULO 3. OS PROGRAMAS DIFF, PATCH, INDENT 31

    O arquivo e06a-hello.cpp foi modificado e salvo como e06b-hello.cpp. Veja a seguir o arquivoe06b-hello.cpp, observe que foram acrescentadas 4 linhas novas e o return foi alinhado.

    Listing 3.2: Arquivo e06b-hello.cpp.#include

    int main(){

    std::cout

  • CAPTULO 3. OS PROGRAMAS DIFF, PATCH, INDENT 32

    ! int x;! cin>>x;! std::cout

  • CAPTULO 3. OS PROGRAMAS DIFF, PATCH, INDENT 33

    Prottipo e parmetros do patch:patch [-u-v] arquivoAntigo arquivoDiferencas.

    -u O arquivo das diferenas foi gerado usando a verso unificada (opo -u no diff).-v Mostra verso do programa patch.

    Dados os arquivos arq1.cpp, arq2.cpp e o arquivo das diferenas gerado pelo diff, voc pode atualizaro arquivo arq1.cpp de forma que o mesmo tenha o mesmo contedo do arq2.cpp. Veja o exemplo.

    Exemplo:diff arq1.cpp arq2.cpp > diferencas.cpp//Vai modificar o arq1 e o mesmo ficar igual a arq2patch arq1.cpp diferencas.cpp

    Ou seja, o programa patch junta os arquivos arq1.cpp e diferencas.cpp criando o arquivo arq2.cpp.

    3.3 O programa indentO programa indent usado para deixar o cdigo organizado, atravs do uso de padres de in-

    dentao. Existe um padro default, pr-estabelecido, mas voc pode definir os padres a seremutilizados. Veja a seguir o prottipo de uso do indent. Lista-se, de forma abreviada, algumas dasopes que podem ser passadas para o indent. Estes parmetros podem ser armazenados no arquivo.indent.pro.

    Prottipo:indent file [-o outfile ] [ opes ]indent file1 file2 ... fileN [ opes ]

    -st Envia sada para tela.-gnu Usa opes de formatao da GNU.-orig Usa opes de formatao da Berkeley.-v Modo verbose.-l60 Limita a 60 colunas.-bad Linha em branco aps declaraes (Para desativar, -nbad).-bap Linha em branco aps definies de funes (-nbap).-bbb Linha em branco antes de uma caixa de comentrio.-sc Comentrios no estilo de C /* * */.-bl5 Colchetes do bloco alinhados a 5 caracteres.-bn Bloco alinhado.-bli5 Bloco alinhado com 5 espaos.-bls Alinha o par{ }.-cli2 Bloco switch alinhado com espao 2.

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 3. OS PROGRAMAS DIFF, PATCH, INDENT 34

    -npcs Sem espao entre o nome da funo e o ().-cs Espao depois do cast.-di16 Indenta nome dos objetos em 16 espaos.-bfda Quebra argumentos da funo em vrias linhas.-lp Alinha parmetros de funes com nomes grandes.

    O programa ex-vector-1.cpp apresentado na seo ??, foi modificado com o programa indent com ocomando:

    Exemplo:cp ex-vector-1.cpp ex-vector-1-indent.cppindent ex-vector-1-indent.cpp

    veja a seguir a listagem do arquivo ex-vector-1-indent.cpp. Compare esta listagem com a listagem ??.Observe a mudana na declarao da funo main, na forma do do..while e nas indentaes.

    Listing 3.6: Arquivo ex-vector-1-indent.cpp.//Classes para entrada e sada#include

    //Classe pra formatao de entrada e sada#include

    //Classe de vetores, do container vector#include

    //Classe para algoritimos genricos//#include

    //Define estar usando espao de nomes stdusing namespace std;

    //Definio da funo mainintmain (){//Cria vector, do tipo int, com nome vvector < int >v;

    int data;cout

  • CAPTULO 3. OS PROGRAMAS DIFF, PATCH, INDENT 35

    while (cin.good ());

    //Acessa partes do vector usando funes front e backcout

  • Captulo 4

    Compilando com gcc, g++

    Neste captulo apresenta-se o compilador gcc/g++ da GNU. O mesmo pode ser baixado no siteda gnu individualmente, ou como parte do pacote do EGCS (que inclui um conjunto de programasacessrios).

    4.1 Prottipo e parmetros do gcc/g++Apresenta-se aqui o prottipo e os parmetros que voc pode passar para o compilador da gnu.

    Posteriormente, atravs dos exemplos, voc compreender melhor cada parmetro.

    Prottipo do gcc/g++:g++ [opes] [parmetros] arquivos.

    -v Mostra detalhes da compilao.-wall Mostra todos os warnings.-onome Define o nome do arquivo de sada (opcional).-w Elimina mensagens de warning.-I/path Acrescenta path include.-l/path/lib Inclue biblioteca (lib).-ggdb Informaes extras para o gdb.-O Otimiza o cdigo (-O1,-O2,-O3).-c Somente compila (gera o arquivo *.o).-S Somente compila o arquivo, no linka.-lcomplex Inclue biblioteca dos complexos.-lm Inclue biblioteca matemtica.-E Cria somente o arquivo pr-processado.-C No inclue comentrios no executvel.-g Gera informaes para o debuger (cdigo lento).-qdigraph Adiciona teclas dgrafas.

    36

  • CAPTULO 4. COMPILANDO COM GCC, G++ 37

    -qcompact Deixa o cdigo mais compacto.-xlinguagem Especifica a linguagem (C, C++,assembler).-p Informaes para o profiler proff.-pg Informaes para o groff.-m686 Especifica que a mquina alvo um 686.-static Especifica que a linkagem deve ser esttica.-p Especifica incluso de instrues para o profiler.-pg Especifica incluso de instrues para o profiler da gnu (gprof).

    4.2 Arquivos gerados pelo gcc/g++A medida que os arquivos so compilados e linkados, so gerados alguns arquivos adicionais.

    Lista-se a seguir os arquivos de entrada (*.h, *.cpp) e os arquivos de sada 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 esttica.

    .sa Blocos de bibliotecas estticas linkados ao programa.

    .so.n Arquivo de biblioteca dinmica.

    a.out Arquivo de sada (executvel).

    4.3 Exemplo de uso do gcc/g++Apresenta-se a seguir um exemplo bsico.

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

    #include using namespace std;int main(){cout < < hello! < < endl;

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 4. COMPILANDO COM GCC, G++ 38

    return; }/*No emacs use ctrl+x ctrl+s para salvar o arquivoe ctrl+x ctrl+q para sair do emacs*/

    2. Cria o arquivo de pr-processamento [opcional].

    g++ -E hello.cpp

    3. Compila o mdulo hello (gera o hello.o).

    g++ -c hello.cpp

    4. Linka o programa e gera o executvel.

    g++ -ohello hello.o

    5. Executa o programa.

    ./hello

    6. Observe que os passos 2, 3 e 4 podem ser executados usando:

    g++ -v -ohello hello.cpp

    O -v mostra um conjunto de informaes a respeito dos passos da compilao.Neste exemplo o nome do programa executvel hello e foi especificado com a opo -ohello. Se

    voc no especificar um nome, o programa executvel se chamar a.out.

    Tarefa: Compare o tamanho dos cdigos (dos executveis) gerados com as opes:

    g++ hello.cpp #comumg++ -g2 hello.cpp #com debugerg++ -o3 hello.cpp #com otimizao

    4.4 Sentenas para o compilador da gnu Para conhecer em detalhes o gcc baixe o manual do gcc no site da gnu.

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • Captulo 5

    Make

    No captulo anterior voc aprendeu a usar o g++ para compilar um programa, como voc podeconstatar, fcil. Mas se seu programa for grande, voc vai ter de executar o g++ para cada arquivo*.cpp, o que se transforma em trabalho tedioso.

    Para evitar este trabalho, foram desenvolvidos os arquivos de projeto. Neste captulo vamos des-crever o que , como escrever e como usar arquivos de projeto e o programa make.

    5.1 Um arquivo de projeto1Um arquivo de projeto permite a compilao de diversos arquivos com uso do programa make.

    Voc pode compilar seus programas diretamente (digitando a instruo de compilao), ouusando arquivos makefile.

    Um arquivo makefile um arquivo de projeto no formato ASCII, que pode ser editado emeditores simples, como o emacs.

    Por padro, um arquivo de projeto makefile tem o nome makefile ou Makefile. Um arquivo de projeto pode ser simples ou complexo, vai depender do tamanho do programa e

    dos recursos utilizados.

    Podemos criar um arquivo Makefile com instrues de compilao. Estas instrues de compilaosero lidas e executadas pelo programa make, automatizando a compilao de programas complexos.Descreve-se a seguir como funciona o programa make.

    5.2 Prottipo e parmetros do makeApresenta-se a seguir o prottipo e os parmetros do programa make. Por padro, o make procura

    no diretrio corrente o arquivo makefile e depois o arquivo Makefile. A opo -f usada para passaro nome do arquivo makefile.

    1Um arquivo de projeto do Borland C++ e do MFC tem um formato proprietrio, que s pode ser lido por estesprogramas. Um arquivo de projeto do kdevelop um arquivo ASCII, podendo ser editado em qualquer editor simples.

    39

  • CAPTULO 5. MAKE 40

    Prottipo do make:make [ -f arq_makefile ] [ opes ] ... alvos ...-e Indica variveis do ambiente que devem prevalecer sobre atribuies feitas no

    make.-k Desconsiderar erros.-n Apenas lista os comandos, sem execut-los.-p Imprime alguns resultados.-r Despreza regras intrnsecas.-t Atualiza data e hora.-s Modo silencioso.-f arq_makefile Especifica o nome do arquivo makefile.

    5.3 Formato de um arquivo MakefileBasicamente, um arquivo makefile dividido em uma parte com definies de variveis e outra

    parte com sub-rotinas a serem executadas.A primeira parte define variveis a serem utilizadas. As variveis incluem o nome do compilador,

    as paths de incluso de arquivos e bibliotecas e listagens de arquivos a serem processados.

    5.3.1 Criando variveis em um arquivo MakefileO make aceita que voc defina variveis em seu arquivo makefile e depois use estas variveis nas

    etapas de compilao.No exemplo a seguir cria uma varivel e usa seu contedo. Observe que para obter o valor da

    varivel voc deve usar um $(). Ao usar $(VARIAVEL), o make substitue o nome da varivel peloseu valor.

    Exemplo:NOMEVARIAVEL = valor$(NOMEVARIAVEL)

    Por conveno, as variveis definidas em um arquivo makefile so todas maisculas. Voc pode criar variveis da forma

    CC = g++

    E a seguir modificar seu valor, acrescentando algo em modo append

    CC += -O2

    2Make usa um conjunto de variveis com nomes pr-definidos.AR Especifica o programa de manuteno de arquivos.

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 5. MAKE 41

    CC Especifica o compilador, default=cc.CPP Especifica o pr-processador C++.RM Programa de remoo de arquivos, default = rm -f .CFLAGS Flags que devem ser passados para o compilador C.CPPFLAGS Flags que devem ser passados para o compilador C++.LDFLAGS Flags que devem ser passados para o linker.

    5.3.2 Criando alvos em um arquivo MakefileA segunda parte de um arquivo makefile contm alvos a serem executados. O formato padro para

    um alvo dado por:

    Prottipo de um alvo:alvo: DependnciasInstrues a serem executadas

    As instrues a serem executadas iniciam com um tab (e no 8 espaos). Geralmente o alvo o nome de um arquivo, uma biblioteca ou um programa a ser compilado. Alvos usuais em arquivos makefile so:

    all Executar todas as dependncias.install Instalar o programa.uninstal Desinstalar o programa.dist Gerar uma distribuio no formato .tar.gz.check Verificar a consistncia da instalao.clean Eliminar arquivos temporrios (*.obj).

    5.4 Exemplo de um arquivo MakefileVeja na listagem a seguir um exemplo de arquivo makefile.

    Listing 5.1: Arquivo makefile.#Toda linha comeada com # uma linha de comentrio#--------------------------------------------------#ParteI: Definio de variveisARQUIVOS=e06a -hello.cppOBJETOS=e06a -hello.oDIRINCLUDE = -I/usr/include/g++ -I/usr/includeDIRETORIOLIB =PARAMETROSLIB = -lmCOMPILADOR = g++

    #--------------------------------------------------

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 5. MAKE 42

    #Parte II: alvos#all o alvo , e06a -hello.o e e06a -hello so as dependncias

    all : e06a -hello.o e06a -hello

    #e06a -hello.o o alvo , $( ARQUIVOS) so as dependncias#e $( COMPILADOR) .. a instruoe06a -hello.o : $(ARQUIVOS)

    $(COMPILADOR) -c $(ARQUIVOS) $(DIRINCLUDE) $(DIRECL) -o e06a -hello.o

    e06a -hello : $(OBJETOS)$(COMPILADOR) $(OBJETOS) $(DIRINCLUDE) $(DIRETORIOLIB) $(PARAMETROSLIB)

    -o e06a -hello

    clean :rm -f *.o *.obj

    Veja na listagem a seguir uma seqencia de execuo do programa make usando o arquivo make-file listado em ??.

    Listing 5.2: Exemplo de uso do programa make.//Limpa os arquivos anteriores[andre@mercurio Cap-GNU]$ make cleanrm -f *.o *.obj

    //Compila o arquivo e06a -hello.o[andre@mercurio Cap-GNU]$ make e06a -hello.og++ -c e06a -hello.cpp -I/usr/include/g++ -I/usr/include -o e06a -hello.o

    //Gera o programa executvel[andre@mercurio Cap-GNU]$ make e06a -hellog++ e06a -hello.cpp -I/usr/include/g++ -I/usr/include -lm -o e06a -hello

    //Veja abaixo que o make no compila novamente o que esta atualizado[andre@mercurio Cap-GNU]$ make e06a -hellomake: e06a -hello est atualizado.

    //Limpando os arquivos obj[andre@mercurio Cap-GNU]$ make cleanrm -f *.o *.obj

    //Observe abaixo que o alvo e06a -hello chama o alvo e06a -hello.o[andre@mercurio Cap-GNU]$ make e06a -hellog++ -c e06a -hello.cpp -I/usr/include/g++ -I/usr/include -o e06a -hello.og++ e06a -hello.cpp -I/usr/include/g++ -I/usr/include -lm -o e06a -hello

    Dica: Observe a forma como os alvos foram traduzidos.O alvo:e06a -hello : $(ARQUIVOS) $(OBJETOS)

    $(COMPILADOR) $(ARQUIVOS) $(DIRETORIOINCLUDE) $(DIRETORIOLIB) $(PARAMETROSLIB) -o e06a -hello

    Foi traduzido da forma:g++ e06a -hello.cpp -I/usr/include/g++ -I/usr/include -lm -o e06a -hello

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 5. MAKE 43

    5.5 Sentenas para o make Para conhecer em detalhes o make baixe o manual do make no site da gnu

    (http://www.gnu.org). Os arquivos especificados nas dependncias devem existir. Se no existirem vai acusar erro. Os arquivos de cabealho *.h tambm devem ser includos nas dependncias. Isto evita a men-

    sagem de erro do compilador pela falta dos mesmos.

    Make inteligente, se voc pediu para executar o alvo 2 e este depende do alvo 1, o makeexecuta primeiro o alvo 1 e depois o alvo 2.

    Se alguma dependncia sofre modificaes, o make recompila os arquivos que foram modifica-dos.

    Alvos sem dependncia no so automaticamente executados. Ao editar um arquivo makefile ou Makefile no emacs, o mesmo aparece com sintaxe especial.

    Auxiliando a implementao do arquivo makefile.

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • Captulo 6

    Bibliotecas

    Apresenta-se neste captulo um conjunto de programas auxilares que so utilizados para mon-tagens de bibliotecas no mundo GNU/Linux. A seguir apresenta-se um exemplo de montagem debiblioteca esttica e um exemplo de montagem de biblioteca dinmica.

    6.1 Introduo a montagem de bibliotecasUma biblioteca uma coleo de objetos (funes, classes, objetos) agrupados em um nico ar-

    quivo. De um modo geral, um conjunto de arquivos com a extenso *.o, so reunidos para gerar umarquivo libNome.a (para biblioteca esttica) ou libNome.so (para biblioteca dinmica). O GNU/Linuxtem um conjunto de programas auxiliares que so utilizados para criar, manter e gerenciar bibliotecasestticas e dinmicas. Apresenta-se a seguir uma breve descrio destes programas. Para obter infor-maes detalhadas de cada programa d uma olhada no man page ou nos manuais dos programas (osmanuais podem ser baixados no site da gnu (http://www.gnu.org)).

    6.1.1 arO programa ar utilizado para manipular arquivos em um formato bem estruturado. O ar tambm

    cria tabelas com smbolos e referncias cruzadas. O programa ar que aglutina todos os objetos emuma lib, isto , agrupa os arquivos *.o em uma lib. Veja a seguir o prottipo e um exemplo de uso doar.

    Prottipo e parmetros do ar:ar [opes] arquivos.

    -t Lista os objetos da lib (biblioteca).-r Substitue funes quando necessrio (arquivos antigos).-q Adiciona no modo apend.-s Atualiza a tabela de smbolos.-c Cria o arquivo se este no existe.-v Modo verbose.

    44

  • CAPTULO 6. BIBLIOTECAS 45

    Exemplo:ar cru libNome.a arq1.o arq2.o arq3.o

    Neste exemplo o programa ar vai juntar os arquivos arq1.o arq2.o arq3.o e gerar o arquivo libNome.a.Veja a seguir a lista completa de opes do comando ar. A mesma pode ser obtida em seu sistema

    digitando ar - -help.

    Listing 6.1: Sada do comando ar - -help.Usage: ar [-X32_64] [-]{dmpqrstx}[abcfilNoPsSuvV] [member -name] [count] archive -

    file file...ar -M [

  • CAPTULO 6. BIBLIOTECAS 46

    6.1.3 nmMostra os smbolos da biblioteca.

    Prottipo e parmetros do nm:nm [opes] arquivo.

    -C |demangle Mostra nomes de forma clara para o usurio.-S |print-armap Imprime ndice dos smbolos.Exemplo:nm libNome.a

    Use o comando nm - -help para obter as opes do comando nm.

    Listing 6.2: Sada do comando nm help .Usage: nm [OPTION ]... [FILE]...List symbols from FILEs (a.out by default).

    -a, --debug -syms Display debugger -only symbols-A, --print -file -name Print name of the input file before every symbol-B Same as --format=bsd-C, --demangle[={auto ,gnu,lucid ,arm ,hp,edg ,gnu -v3,java ,gnat ,compaq}]

    Decode low -level symbol names into user -level names--no-demangle Do not demangle low -level symbol names--demangler=

    Set dso and demangler function-D, --dynamic Display dynamic symbols instead of normal symbols

    --defined -only Display only defined symbols-e (ignored)-f, --format=FORMAT Use the output format FORMAT. FORMAT can be bsd ,

    sysv or posix . The default is bsd -g, --extern -only Display only external symbols-h, --help Display this information-l, --line -numbers Use debugging information to find a filename and

    line number for each symbol-n, --numeric -sort Sort symbols numerically by address-o Same as -A-p, --no-sort Do not sort the symbols-P, --portability Same as --format=posix-r, --reverse -sort Reverse the sense of the sort-s, --print -armap Include index for symbols from archive members

    --size -sort Sort symbols by size-t, --radix=RADIX Use RADIX for printing symbol values

    --target=BFDNAME Specify the target object format as BFDNAME-u, --undefined -only Display only undefined symbols-V, --version Display this program s version number-X 32_64 (ignored)

    nm: supported targets: elf32 -i386 a.out -i386 -linux efi -app -ia32 elf32 -littleelf32 -big srec symbolsrec tekhex binary ihex trad -core

    Report bugs to [email protected] and and [email protected].

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 6. BIBLIOTECAS 47

    6.1.4 objdumpImprime informaes sobre as bibliotecas e objetos.

    Prottipo e parmetros do objdump:objdump [opes][parmetros]

    -d, -debugging.-syms Tabela de smbolos.-a Informaes arquivo.

    Exemplo:objdump -file-header file.o

    Dica: Para maiores detalhes, execute objdump - -help.

    6.1.5 lddLista as bibliotecas dinmicas que determinado programa usa.

    Prottipo e parmetros do ldd:ldd [-d-r] programa

    - -help Imprime um help.- -version Imprime a verso do ldd.-d,- -data-relocs Processa uma realocao dos dados.r,- -function-relocs Processa uma realocao dos dados e funes.-v,- -verbose Imprime informaes em geral.

    Exemplo:ldd /bin/netscape

    Veja a seguir a sada do comando ldd /usr/bin/lyx. Lembre-se que LYX o editor utilizado para montaresta apostila. Observe o uso das bibliotecas libXForms, Xpm, X11 e libstdc++.

    Listing 6.3: Sada do comando ldd /usr/bin/lyx.libforms.so.0.88 => /usr/lib/libforms.so.0.88 (0 x40032000)libXpm.so.4 => /usr/X11R6/lib/libXpm.so.4 (0 x400b4000)libSM.so.6 => /usr/X11R6/lib/libSM.so.6 (0 x400c3000)libICE.so.6 => /usr/X11R6/lib/libICE.so.6 (0 x400cc000)libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0 x400e3000)libstdc++-libc6.2-2.so.3 => /usr/lib/libstdc++-libc6.2-2.so.3 (0

    x401d9000)libm.so.6 => /lib/i686/libm.so.6 (0 x4021c000)libc.so.6 => /lib/i686/libc.so.6 (0 x4023f000)/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0 x40000000)

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 6. BIBLIOTECAS 48

    6.1.6 ldconfigO programa ldconfig determina os links necessrios em tempo de execuo para bibliotecas com-

    partilhadas (shared libs)1 .Prottipo e parmetros do ldconfig:

    ldconfig [-p-v]libs-p Mostra bibliotecas compartilhadas.-v Modo verbose.

    6.2 Conveno de nomes para bibliotecas O nome de uma biblioteca deve iniciar com lib. A extenso ser *.a para bibliotecas estticas. A extenso ser *.so para bibliotecas dinmicas. Verses:

    libNome.so.VersoMaior.VersoMenor.PatchA verso maior uma verso incompatvel com as demais.A verso menor inclue novidades.A patch inclue correes de bugs.

    Uma biblioteca que tem o nome encerrado com -g contm instrues de debugagem. Uma biblioteca que tem o nome encerrado com -p contm instrues para o profiler (gprof).

    6.3 Bibliotecas usuaisApresenta-se na Tabela ?? algumas bibliotecas usuais.

    6.4 Montando uma biblioteca esttica (libNome.a)Para utilizar a biblioteca o programador precisa dos arquivos com o cabealho (formato como os

    objetos e as funes foram construdos) e o arquivo da lib.Seqencia para criar uma biblioteca esttica no GNU/Linux:

    1. Cria o arquivo de cabecalho *.h (declarao das funes em C e das classes em C++)

    emacs Tponto.hTPonto.h class TPonto { .....};//ctrl+x ctrl+s para salvar//ctrl+x ctrl+c para sair

    1Descrito no livro Linux Unleashed, no disponvel em minha mquina.

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 6. BIBLIOTECAS 49

    Tabela 6.1: Bibliotecas usuais.

    Biblioteca Include UsolibGL.so Interface para OpenGLlibjpeg.so Interface para arquivos jpeglibpbm.so Interface para bitmaps monocromticoslibpgm.so Interface para bitmaps tons de cinzalibpng.so Interface para arquivos portable bitmap formatlibpnm.so Interface para bitmaps pbm, ppm, pgm

    libpthread.so Posix Threadslibvga.so Acesso a tela vgalibz.so Biblioteca para compactao de arquivosglibc Biblioteca padro C

    magick++ Biblioteca grfica

    2. Cria o arquivo de cdigo *.cpp (definio das funes)

    emacs TPonto.cpp/*Define funes da classe*/ ....

    3. Compila os arquivos de cdigo (*.cpp) gerando os arquivos (*.o)

    g++ -c TPonto.cpp

    4. Cria a biblioteca (a lib)

    ar -q libNome.a TPonto.o

    5. Publica a biblioteca com

    ranlib libTPonto.a

    Observe que os tens 1 e 2 se referem a edio dos arquivos do programa. Em 3, o programa com-pilado. Pode-se utilizar um arquivo makefile para automatizar esta tarefa. Em 4, cria-se a biblioteca,gerando-se o arquivo libTPonto.a. Em 5 a biblioteca publicada no sistema.

    6.4.1 Usando uma biblioteca estticaNo exemplo a seguir compila o programa Prog.cpp e pede para linkar em modo esttico (-static)

    a biblioteca nomeLib que esta localizada em pathLib.

    Exemplo:g++ Prog.cpp -static -LpathLib -lnomeLib

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 6. BIBLIOTECAS 50

    6.5 Montando uma biblioteca dinmica (libNome.so)Roteiro para criar uma biblioteca dinmica no GNU/Linux:

    1. Cria o arquivo de cabecalho *.h (declarao das funes e classes)

    emacs TPonto.hclass TPonto { .....};

    2. Cria o arquivo de cdigo *.cpp (definio das funes)

    emacs TPonto.cpp/*Define funcoes da classe*/

    3. Compila os arquivos de cdigo (*.cpp) gerando os arquivos *.oA opo -fPIC, gera o cdigo com posicionamento independente, podendo o mesmo ser carre-gado em qualquer endereo.

    g++ -fPIC -c TPonto.cpp -o TPonto.o

    4. Cria a biblioteca dinmicaA opo -WL passa informaes para o linker ld.

    g++ -shared -Wl,-soname,TPonto.so.1 -o libTPonto.so.1.0 TPonto.o

    5. Copia a lib para /usr/local/lib (como root)

    cp libTPonto.so.1.o /usr/local/lib

    6. Pode-se criar links simblicos para a lib

    cd /usr/local/lib/ln -s libTPonto.so.1.o libTPonto.so.1ln -s libTPonto.so.1.o libTPonto.so

    7. Publica a lib(#inclue na tabela de bibliotecas dinmicas, cria link, e inclue em /etc/ld.so.cache)

    /sbin/ldconfig

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 6. BIBLIOTECAS 51

    6.5.1 Usando uma biblioteca dinmicaO exemplo ilustrado a seguir inclue o arquivo #include , um arquivo de incluso de

    bibliotecas dinmicas. Veja no exemplo outras informaes (extrado da fonte [5]).#include #include ....main(){//Cria ponteiro para a libvoid* ptrLib;//Cria ponteiro para funo da libvoid (*ptrFuncaoLib)();//Carrega a lib//dlopen(const char* fileName, int flag);ptrLib = dlopen("nomeLib.so.1.0",RTLD_LAZY);//Verifica se no tem erro com a funo dlerror//const char* dlerror();cout < < dlerror();//Obtm endereo da funo//void* dlsym(void* handle,char* simbolo);ptrFuncaoLib = dlsym(ptrLib,"NomeFuncaoNaLib");//Usa a funoint x = (*ptrFuncaoLib)();//Fecha a lib//int dlclose(void * handle);dlclose(ptrLib);}

    6.5.2 Vantagens/desvantagens da biblioteca dinmica Em uma biblioteca esttica o programa maior porque inclue todas as bibliotecas. Quando o programa linkado com bibliotecas dinmicas, o mesmo fica menor, pois as biblio-

    tecas so carregadas em tempo de execuo.

    Um programa que faa uso de uma biblioteca dinmica no precisa ser recompilado se ocor-reram modificaes na biblioteca. S ser necessrio modificar o programa que acessa a bi-blioteca dinmica se o mesmo utilizar objetos da biblioteca que sofreram modificaes na suainterface.

    Veja a seguir um arquivo makefile para gerar o programa e87-Polimorfismo.cpp, anteriormente apre-sentado. Parte da listagem inclue instrues para o programa libtool que ser apresentado no Captulo??.

    Listing 6.4: Arquivo makefile com bibliotecas estticas e dinmicas.#============================== DEFINICOES ==================================ARQUIVOS= e87-TCirculo.cpp e87-TElipse.cpp e87 -TPonto.cpp e87 -Polimorfismo.

    cpp

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 6. BIBLIOTECAS 52

    OBJETOS= e87-TCirculo.o e87-TElipse.o e87 -TPonto.oDIRINCLUDE = -I/usr/include/g++ -I/usr/includeDIRLIBD = /home/andre/Andre/ApostilasPessoais/ApostilaProgramacao/Exemplos/

    cursocpp/Cap-GNU/bibliotecaPARAMETROSLIB= -lmCOMPILADOR = g++LIBS = TPontoLIBD = TPontoPROG = e87-Polimorfismo.cpp

    #---------------Lista de opes.#list:# "obj: Gera objetos comuns# exe: Gera executvel comum"# all: obj exe# libs: Gera biblioteca esttica# exes: Gera executvel usando biblioteca esttica# alls: libs exelibs# libd: Gera biblioteca dinmica# exed: Gera executvel usando biblioteca dinmica# libs_libtool: Gera biblioteca estatica usando lib_tool# exes_libtool: Gera executvel usando biblioteca estatica e libtool# init_doc: Inicializa o doxygem# doc: Gera documentao a partir de cdigo documentado# clean: Apaga arquivos "

    #---------------Compilao padroall : obj exe

    obj : $(ARQUIVOS)$(COMPILADOR) -c $(ARQUIVOS) $(DIRINCLUDE) $(DIRECL)

    exe : $(PROG) $(OBJETOS)$(COMPILADOR) $(PROG) $(OBJETOS) $(DIRINCLUDE) $(DIRETORIOLIB) $(

    PARAMETROSLIB) -o e87-Polimorfismo

    #---------------Criando biblioteca estticaalls : libs exelibs

    libs : $(OBJETOS)ar -q libTPonto.a $(OBJETOS)

    #ar -cru libTPonto.a $(OBJETOS)ranlib libTPonto.a #publica a lib

    #Criando executavel usando a biblioteca estticaexelibs : libs

    $(COMPILADOR) e87-PolimorfismoStatic.cpp -static -L. -l$(LIBS) -o e87-PolimorfismoStatic

    #---------------Criando biblioteca dinmicaalld : objd libd

    objd : $(ARQUIVOS)$(COMPILADOR) -fPIC -c $(ARQUIVOS) $(DIRINCLUDE) $(DIRECL)

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 6. BIBLIOTECAS 53

    libd : $(OBJETOS)$(COMPILADOR) -shared -Wl,-soname ,TPonto.so.1 -o libTPonto.so.1.0 $(

    OBJETOS)ln -s libTPonto.so.1.0 libTPonto.so.1ln -s libTPonto.so.1.0 libTPonto.so/sbin/ldconfig #publica a biblioteca (como root)

    #---------------Criando executavel usando a biblioteca dinmicaexelibd : e87-PolimorfismoDinamic.cpp libd

    $(COMPILADOR) e87-PolimorfismoDinamic.cpp -L$(DIRLIBD) -l$(LIBD) -o e87-PolimorfismoDinamic

    #---------------Limpeza.clean :

    rm -f *.o *.obj *.so* a.out e87 -PolimorfismoDinamic e87 -PolimorfismoStatic *.*~ *~ libTPonto.*

    #============================== USANDO LIBTOOL ==========================#Para ficar portvel , todas as etapas devem ser realizadas com o libtool#obj_libtool : $(ARQUIVOS)# libtool $(COMPILADOR) -c $(ARQUIVOS)

    #---------------Criando biblioteca estatica usando o libtoollibs_libtool: $(ARQUIVOS)

    libtool $(COMPILADOR) -o libTPonto.a $(ARQUIVOS)

    #---------------Criando executavel usando libtool com biblioteca estatica#Incompletoexes_libtool: e87-PolimorfismoStatic.cpp libs_libtool

    libtool $(COMPILADOR) e87-PolimorfismoStatic.cpp -static -L. -l$(LIBS) -o e87-PolimorfismoStatic -libtool

    #---------------Criando biblioteca dinmica usando o libtoollibd_libtool: $(ARQUIVOS)

    libtool $(COMPILADOR) -o libTPonto.la $(ARQUIVOS)

    #---------------Criando executavel usando libtool com biblioteca dinmica#Incompletoexed_libtool: e87-PolimorfismoStatic.cpp libd_libtool

    libtool $(COMPILADOR) e87-PolimorfismoDinamic.cppp libTPonto.la -o e87-PolimorfismoDinamic -libtool

    #---------------Criando documentao com doxygeminit_doc:

    doxygen -g doxygem.config

    doc : $(ARQUIVOS)doxygen doxygem.config

    Faa cpias do e87-Polimorfismo.cpp criando os arquivos e87-PolimorfismoStatic.cpp ee87-PolimorfismoDinamic.cpp e ento execute a seqencia ilustrada a seguir.

    Listing 6.5: Arquivo mostrando o uso do makefile.

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 6. BIBLIOTECAS 54

    [root@mercurio biblioteca]# make cleanrm -f *.o *.obj *.so* a.out e87-PolimorfismoDinamic e87 -PolimorfismoStatic

    *.*~ *~ libTPonto.*

    [root@mercurio biblioteca]# make allg++ -c e87-TCirculo.cpp e87-TElipse.cpp e87 -TPonto.cpp e87 -Polimorfismo.cpp -

    I/usr/include/g++ -I/usr/includeg++ e87-Polimorfismo.cpp e87-TCirculo.o e87 -TElipse.o e87 -TPonto.o -I/usr/

    include/g++ -I/usr/include -lm -o e87 -Polimorfismo

    [root@mercurio biblioteca]# make allsar -q libTPonto.a e87-TCirculo.o e87 -TElipse.o e87 -TPonto.oranlib libTPonto.a #publica a libg++ e87-PolimorfismoStatic.cpp -static -L. -lTPonto -o e87 -PolimorfismoStatic

    [root@mercurio biblioteca]# make alldg++ -fPIC -c e87-TCirculo.cpp e87 -TElipse.cpp e87 -TPonto.cpp e87 -Polimorfismo.

    cpp -I/usr/include/g++ -I/usr/includeg++ -shared -Wl,-soname ,TPonto.so.1 -o libTPonto.so.1.0 e87 -TCirculo.o e87-

    TElipse.o e87-TPonto.oln -s libTPonto.so.1.0 libTPonto.so.1ln -s libTPonto.so.1.0 libTPonto.so/sbin/ldconfig #publica a biblioteca (como root)

    [root@mercurio biblioteca]# make libs_libtoollibtool g++ -o libTPonto.a e87-TCirculo.cpp e87 -TElipse.cpp e87 -TPonto.cpp e87

    -Polimorfismo.cppar cru libTPonto.aranlib libTPonto.a

    [root@mercurio biblioteca]# make libd_libtoollibtool g++ -o libTPonto.la e87-TCirculo.cpp e87 -TElipse.cpp e87 -TPonto.cpp

    e87-Polimorfismo.cpprm -fr .libs/libTPonto.la .libs/libTPonto .* .libs/libTPonto.*ar cru .libs/libTPonto.alranlib .libs/libTPonto.alcreating libTPonto.la(cd .libs && rm -f libTPonto.la && ln -s ../ libTPonto.la libTPonto.la)

    6.6 Sentenas para bibliotecas O padro para o nome da lib : libNome.so.versao.subversao.release. Voc pode acrescentar novas paths para bibliotecas dinmicas modificando a varivel de ambi-

    ente LD_LIBRARY_PATH.

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • Captulo 7

    Libtool

    Neste captulo apresenta-se o libtool, mais um pacote da gnu, utilizado para facilitar o desenvol-vimento de programas em mltiplas plataformas.

    7.1 Introduo ao libtool2

    Como ser descrito nos captulos seguintes, o libtool mais um programa da gnu que facilita o de-senvolvimento de bibliotecas multiplataforma. O mesmo usado para desenvolvimento de bibliotecasno ambiente GNU/Linux.

    Vantagens do uso do libtool

    Maior elegncia. Integrado ao autoconf e automake. Maior portabilidade. Trabalha com bibliotecas estticas e dinmicas.

    7.2 Forma de uso do libtoolComo fao para usar o libtool ?De um modo geral, basta digitar o comando libtool seguido do comando que voc usaria para

    compilar seu programa ou biblioteca.Exemplos de uso do libtool esto listados no diretrio do libtool.Veja a seguir a sada do comando libtool - - help.

    Listing 7.1: Arquivo libtool - -help.Usage: libtool [OPTION ]... [MODE -ARG]...

    Provide generalized library -building support services.

    --config show all configuration variables--debug enable verbose shell tracing

    -n, --dry-run display commands without modifying any files

    55

  • CAPTULO 7. LIBTOOL 56

    --features display basic configuration information and exit--finish same as --mode=finish --help display this help message and exit--mode=MODE use operation mode MODE [default=inferred from MODE -ARGS]--quiet same as --silent --silent dont print informational messages--version print version information

    MODE must be one of the following:

    clean remove files from the build directorycompile compile a source file into a libtool objectexecute automatically set library path , then run a programfinish complete the installation of libtool librariesinstall install libraries or executableslink create a library or an executableuninstall remove libraries from an installed directory

    MODE -ARGS vary depending on the MODE. Try libtool --help --mode=MODE fora more detailed description of MODE.

    7.3 Criando uma biblioteca sem o libtoolReveja a seguir como criar uma biblioteca esttica sem uso do libtool.

    Exemplo:ar cru libNome.a a.o b.o c.oranlib libNome.a

    Para criar uma biblioteca esttica usando o arquivo makefile anteriormente apresentado execute ocomando:

    Exemplo:make cleanmake libs

    A sada gerada pelo makefile dada por:

    [andre@mercurio libtool-biblioteca]$ make libsg++ -c -o e87-TCirculo.o e87-TCirculo.cppg++ -c -o e87-TElipse.o e87-TElipse.cppg++ -c -o e87-TPonto.o e87-TPonto.cppar -q libTPonto.a e87-TCirculo.o e87-TElipse.o e87-TPonto.oranlib libTPonto.a

    7.4 Criando uma biblioteca esttica com o libtoolVeja a seguir como usar o libtool para gerar a biblioteca esttica.

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 7. LIBTOOL 57

    Exemplo:libtool g++ -o libTPonto.a e87-TPonto.cpp

    e87-TElipse.cpp e87-TCirculo.cpp

    Veja a seguir a sada gerada pelo libtool.mkdir .libsar cru libTPonto.aranlib libTPonto.a

    7.5 Criando uma biblioteca dinmica com o libtoolO mesmo exemplo usando o libtool e biblioteca dinmica. Observe que a nica alterao o nome

    da biblioteca, que agora se chama libTPonto.la.

    Exemplo:libtool g++ -o libTPonto.la e87-TPonto.cpp

    e87-TElipse.cpp e87-TCirculo.cpp

    Veja a seguir a sada gerada pelo libtool.rm -fr .libs/libTPonto.la .libs/libTPonto.* .libs/libTPonto.*ar cru .libs/libTPonto.alranlib .libs/libTPonto.alcreating libTPonto.la (cd .libs && rm -f libTPonto.la

    && ln -s ../libTPonto.la libTPonto.la)

    7.6 Linkando executveisFormato usual:

    Exemplo:g++ -o nomeExecutvel nomePrograma.cpp libNome.la

    Formato usando o libtool:

    Exemplo:libtool g++ -o nomeExecutvel nomePrograma.cpp libNome.a

    7.7 Instalando a bibliotecaFormato usual:

    Exemplo://como rootcp libNome.a /usr/libranlib /usr/lib/libNome.a

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 7. LIBTOOL 58

    Formato usando o libtool:

    Exemplo:libtool cp libNome.a /usr/lib///oulibtool install -c libNome.a /usr/lib/libNome.la//oulibtool install -c .libs/libNome.a /usr/lib/libNome.so.0.0libtool install -c .libs/libNome.a /usr/lib/libNome.lalibtool install -c .libs/libNome.a /usr/lib/libNome.a

    7.8 Modos do libtoolPara saber mais sobre o funcionamento de cada um dos mdulos abaixo listados, execute o co-

    mando: libtool - -help - -mode = MODO.

    Compilao, o libtool atua chamando o compilador do sistema:libtool - -help - -mode=compile

    Linkagem, o libtool atua executando a linkagem:libtool - -help - -mode=link

    Instalao, o libtool atua instalando o programa:libtool - -help - -mode=install

    Execuo, o libtool atua executando o programa:libtool - -help - -mode=execute

    Desinstalao, o libtool atua desinstalando o programa:libtool - -help - -mode=uninstall

    7.9 Sentenas para o libtool Para executar o gdb com o libtool use:

    libtool gdb nomePrograma

    Para obter informaes do libtool:

    libtool - -help

    Para gerar apenas bibliotecas estticas, passar o flag:

    --disable-shared

    Durante o desenvolvimento costuma-se usar biblioteca esttica com opo de debugagem.

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • CAPTULO 7. LIBTOOL 59

    Em 9/2001 o libtool ainda no era totalmente compatvel com C++. Leia o livro GNU AUTOCONF, AUTOMAKE, AND LIBTOOL disponvel gratuitamente no

    site (http://sources.redhat.com/autobook/). Bibliotecas compartilhadas usam a especificao PIC (position independent code).

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • Captulo 8

    Debug (Depuradores, Debuggers)

    Apresenta-se neste captulo informaes sobre o debuger da gnu, o gdb.

    8.1 Introduo ao debugerBem, voc um bom programador, mas..., ainda existem alguns probleminhas, e voc ter de

    rastrear o seu cdigo para eliminar aqueles pequenos insetos. No adianta, voc vai ter de debugarseu cdigo.

    Mas afinal de contas o que e para que serve um debuger ?Um debuger um programa que monitora a execuo de outros programas. Com o debuger voc

    pode acompanhar a execuo do programa e identificar onde o mesmo esta com problemas. Para tal,o debuger possibilita a avaliao do contedo das variveis e o acompanhamento passo a passo daexecuo do programa.

    O GNU/Linux, Unix tem o gdb, um debug em modo texto e seus frontends o xgdb e o kdbg.Antes de mais nada, para poder debugar o seu cdigo, voc precisa acrescentar as informaes

    para o debug passando a opo de compilao -g (CPPFLAGS= -g). Desta forma o gdb poderexaminar o seu executvel (ou o arquivo core) para verificar o que aconteceu.

    8.2 Comandos do gbdApresenta-se na Tabela ?? uma lista com os comandos do gdb.

    8.3 Exemplo de uso do gdbUm pequeno exemplo de uso do gdb.

    Exemplo(gdb) Run //Roda o programa(gdb) backtrace //Mostra a pilha (o ltimo comando executado)(gdb) break 23 //Acrescenta breakpoint na linha 23(gdb) list //Mostra o cdigo fonte perto do breakpoint(gdb) p var //Mostra o contedo da varivel(gdb) c //Continua execuo

    60

  • CAPTULO 8. DEBUG (DEPURADORES, DEBUGGERS) 61

    Tabela 8.1: Comandos do gdb.

    Comando Aogdb Executa o debuger.

    run prog Executa o programa prog.run prog arg Roda o programa com os argumentos.

    bt Apresenta um rastreamento da pilha.break func Cria breakpoint na funo func.list arq.cpp Visualiza o arq.cpp.

    break 25 (ou b25) Acrescenta breakpoint na linha 25.delete (d) Deleta os breakpoint.

    c Continua.step Executa um passo.

    step 10 Executa os prximos 10 passos.next Executa uma linha.

    next 12 Executa as prximas 12 linhas.print var Imprime o contedo da varivel.

    what atributo Mostra contedo do atributo/varivel.quit Abandona o debug.

    help com Help sobre o comando.

    8.4 Sentenas para o gdb No GNU/Linux, quando um programa trava ou encerrado de forma inesperada, gerado um

    arquivo core. O arquivo core pode ser aberto pelo gdb para localizar a posio onde o programatravou.

    No gnu voc pode simplificar o trabalho de debugagem incluindo a macro __FUNCTION__que imprime o nome da funo que esta sendo executada.

    Exemplo:cout < < na funo : < < __FUNCTION__ < < endl;

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

  • Captulo 9

    Profiler (gprof)2

    Neste captulo apresenta-se brevemente o gprof, o profiler da gnu.

    9.1 Introduo ao gprofUm profiler um programa utilizado para avaliar o desempenho do seu programa, permitindo

    encontrar os gargalos (pontos onde o programa demora mais).O profiler apresenta um grfico com o tempo de execuo de cada funo.Primeiro compila o programa incluindo a opo -pg. Criando o executvel a.out que aberto pelo

    gprof

    g++ -pg ex-funcaoobjeto1.cpp

    A seguir executa o gprof

    gprof --brief -p

    Veja abaixo a sada gerada pelo gprof

    [andre@mercurio Cap4-STL]$ gprof --brief -pFlat profile:Each sample counts as 0.01 seconds. no time accumulated% cumulative self self total time seconds seconds calls Ts/call Ts/call name0.00 0.00 0.00 28 0.00 0.00 _Deque_iterator::_S_buffer_size(void)0.00 0.00 0.00 21 0.00 0.00 _Deque_iterator::operator!=(_Deque_iterator const &) const0.00 0.00 0.00 17 0.00 0.00 _Deque_iterator::operator-(_Deque_iterator const &) const0.00 0.00 0.00 15 0.00 0.00 _Deque_base::~_Deque_base(void)0.00 0.00 0.00 14 0.00 0.00 void destroy(int *, int *) 0.

    Observe a direita o nome da funo e a esquerda o tempo de execuo.

    9.2 Sentenas para o profiler: Para aprender a usar o gprof, baixe e leia o manual do gprof no site da gnu.

    62

  • CAPTULO 9. PROFILER (GPROF)2 63

    Se voc quer um compilador mais rpido e usa mquinas com processadores pentium pense emusar o pgcc. Um compilador descendente do compilador da gnu e otimizado para processadorespentium. Procure por pgcc na internet.

    Voc s deve se preocupar com performance (e com o gprof) depois que for um bom progra-mador. Primeira faa com que os programas funcionem, a seguir se preocupe com bugs, faa adocumentao,...., depois de tudo se preocupe com a performance.

    Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Du