• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

libinha

Construcao de uma livraria

22 mensagens neste tópico

Ola, :D

Eu estou a comecar a trabalhar com c++, mais propriamente com livrarias, classes, etc. Hoje tentei criar uma livraria, a qual chamo em outro programa. O problema é que deu erro. Diz que nao da para abrir o file .h.

Eu fiz o #include "sta_lib.h" e também nos settings do projecto coloquei la o nome da livraria, contudo nao esta funcionando. Alguem me pode ajudar?

Obrigada

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes detalhar melhor como procedeste à criação da biblioteca?

O processo costumar ser o seguinte (vou assumir que estás a trabalhar em Windows com Visual C++):

  • Escrever o código da biblioteca, declarando tudo em ficheiros .h e definindo em ficheiros .c
  • Compilar esse código em modo de biblioteca estática ou dinâmica (em ambos os casos o compilador deve gerar um ficheiro .lib)
  • Adicionar a pasta onde estão os ficheiros .h da biblioteca nos settings do projecto (esta opção encontra-se no separador Pre-processor, salvo erro)
  • Adicionar o nome e a pasta onde se encontre o ficheiro .lib nos settings do projecto (esta opção encontra-se no separador Linker, salvo erro)

Penso que isto deve funcionar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como é feita essa compilacao?eu fiz normalmente e o ficheiro .lib foi criado na pasta de debug.

O terceiro ponto é que eu nao fiz, talvez seja por isso entao.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como é feita essa compilacao?eu fiz normalmente e o ficheiro .lib foi criado na pasta de debug.

O terceiro ponto é que eu nao fiz, talvez seja por isso entao.

Separador General nos Settings do projecto. Em Configuration Type escolhes Static Library (.lib) ou Dynamic Library (.dll).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

que estranho mas eu nao vejo essa opcao...devo estar a fazer mal

Faz update para o Visual C++ 2008 Express. Como já te disse não recomendo que uses a versão 5 e 6 do Visual C++. Estão demasiado desactualizadas e como eu nunca as usei não te posso ajudar.

Mas se já tens o ficheiro .lib não tens de alterar isso. Apenas tens de configurar o projecto como eu referi no ponto 3 e 4.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, a parte do file .lib esta criada. O problemas esta quando eu tenho usar a mesma noutro projecto.Eu fui aos settings do projecto e fiz a inclusao da directoria onde diz General/Additional include directories....nao sei se estara bem porque o erro persiste

O erro que me da tem a ver com o:

#include "livraria.h"

No such file or directory

Sera que tem a ver pelo facto do projecto de livraria ter um determinado nome e o file .h ter outro?

Parece que sim!!Ele criou a livraria de nome igual à do projecto mas o file .h é diferente!!!Ja está a funcionar.

Ma se calhar é melhor dar o mesmo nome ou nao?

Obrigada

E Para criar uma DLL o processo é o mesmo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Os nomes não interessam, desde que depois metas bem nas opções de linking e includes.

Quanto ao problema, para ficheiros que não se encontram no mesmo directório, tens de usar #include <ficheiro.h> em vez de #include "ficheiro.h".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que eu fiz foi indicar o directorio onde se encontrava, mas de facto assim é bem mais fácil.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quanto ao problema, para ficheiros que não se encontram no mesmo directório, tens de usar #include <ficheiro.h> em vez de #include "ficheiro.h".

Percebo porque o dizes Triton. E tens razão. Mas quero resalvar que é uma questão de preferências sendo que a sugestão só realmente funciona se a path para o ficheiro se encontrar ou na variável de ambiente ou na lista de paths a pesquisar pelo compilador. No entanto surge o perigo de ficheiros com o mesmo nome, sendo que em duas bibliotecas que empreguem ficheiro.h, uma delas nunca terá o seu header incluido.

O path para um header poderá ser ainda melhor forma. Repara como o Boost resolve o problema.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ainda bem que referiste esse problema. Ainda hoje fui "mordido" pelo compilador ao tentar incluir um ficheiro com nome duplicado, e estava a ter uns erros estranhos de compilação. Acho que vou adicionar os includes numa pasta e usar essa pasta no path para os headers como sugeriste.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Essa parte da variavel de ambiente eu nao entendi. Trata-se de alguma variavel que se cria com a lista dos paths de todas as bibliotecas?E onde se encontra ela?No sistema do computador?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu tentei ir ao painel de control\system\advanced e criei uma environment variable...é isso?e depois coloquei o nome dessa variavel no linker....mas nao está a funcionar!!!podem-me ajudar?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Depende do compilador. Cada um tem a sua lista de variáveis de ambiente que pode usar. Em todo o caso não é a forma adequada de o fazer. A lista de includes do compilador e a path na directiva #include quando necessário são a formas mais adequadas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque?e se eu tiver de usar mais do que 5 livrarias e todas elas em paths diferentes, isso  justifica-se?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok!eu estava a colocar apenas o nome da variavel e nao: $(variavel)|include....Obrigada

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nesse caso de quereres usar várias bibliotecas em vários projectos, podes adicionar as paths na lista global do Visual Studio (Tools - Options - Projects and Solutions - VC++ Directories).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque?e se eu tiver de usar mais do que 5 livrarias e todas elas em paths diferentes, isso  justifica-se?

Só um aparte... chamam-se bibliotecas, não livrarias.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não depende nada do ponto de vista. Tenho profs que te chumbam de ano se chamares livraria em vez de biblioteca...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, mas eu nao sou uma aluna...por isso podem-me chumbar à vontade!!;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma das coisas que vais eventualmente aprender em relação ao C++ é que a precisão na linguagem a utilizar é fundamental.

É certo que uma distinção entre livraria e biblioteca numa conversa informal como esta não é de grande importância. Também é certo que não existe ainda uma descrição formal da terminologia associada ao C++ (e às ciências computacionais em geral) na língua Portuguesa. Em todo o caso, não descartes o que foi dito em relação ao termo "correcto" (neste caso o termo ad hoc adoptado) a utilizar. Isto porque outras áreas desta linguagem há em que a utilização do termo exacto fará a diferença entre uma pergunta e a sua resposta. Já agora, também porque parte do processo de aprendizagem da linguagem será mais fácil se observarmos correctamente os termos a usar, pelo que começares agora só te vai ajudar.

Dou-te um exemplo:

Inicialização e Atribuição e Declaração

Á semelhança de muitas outras linguagens de programação, parece óbvio que a presença de int foo = 12 declara e inicializa uma variável chamada foo. Já a pesença de foo = 13 poder-se-á chamar de atribuição do valor 13 à variável foo, uma vez que esta já terá sido declarada anteriormente,

No entanto em C++ as coisas nem sempre são bem o que parecem, e um correcto entendimento destes termos irá ajudar a sua aprendizagem (é normalmente por isso que sou bastante crítico de muitos dos livros que existem no mercado).

E se eu te disser que foo = 13 poderá não ser uma atribuição, mas uma inicialização?

É que se eu declarar int foo; fora dentro1 de uma função esta variável estará apenas declarada e não inicializada, sendo que a primeira tentativa de alterar o seu valor será portanto uma inicialização, e não uma atribuição. A diferença é importante por várias razões. Uma delas é que o processo de atribuição envolve dois passos -- apagar o valor existente, copiar o novo valor -- enquanto que inicialização envolve apenas o último destes passos. Também o processo de inicialização envolve uma chamada ao construtor do objecto, enquanto que o processo de atribuição não. Por outro lado, em objectos definidos pelo programador (classes) o processo de atribuição e inicialização podem ser expressos de forma completamente diferente já que a linguagem a isso mesmo te obriga. Portanto, se alguém me diz que atribuiu o valor 13 a uma variável, saberei de antemão que essa variável foi declarada e inicializada anteriormente. Já se a pessoa me disser que inicializou uma variável com o valor 13, poderei necessitar de saber se essa variável já foi declarada ou não.

Haveria muito mais a dizer em relação a esta questão, mas penso que a ideia ficou que procurares prestar atenção ao léxico associado ao C++ é muito importante para melhor compreenderes a linguagem de programação, como funciona e consequentemente melhor te ajudar a fazeres os teus programas, interpretares erros no debugger e expressares as tuas dificuldades num forum.

EDIT: 1 Obrigado pela correcção, TheDark. Não me tinha apercebido.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora