Ir para o conteúdo
libinha

Construcao de uma livraria

Mensagens Recomendadas

libinha    0
libinha

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Triton    12
Triton

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
libinha    0
libinha

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Triton    12
Triton

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).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Triton    12
Triton

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
libinha    0
libinha

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Triton    12
Triton

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".

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Marfig    0
Marfig

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Triton    12
Triton

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
libinha    0
libinha

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
libinha    0
libinha

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Marfig    0
Marfig

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Triton    12
Triton

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).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
TheDark    0
TheDark

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Marfig    0
Marfig

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.

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade