none
Ajuda com um erro LNK2019 de stackavail. RRS feed

  • Pergunta

  • Pessoal,

    Está dando o seguinte erro no meu projeto e já procurei muito e ainda não consegui resolver.
    Se alguem puder me ajudar.

    Error    66    error LNK2019: unresolved external symbol "unsigned int __cdecl stackavail(void)" (?stackavail@@YAIXZ) referenced in function "protected: int __thiscall TWndw::infere(class Thipotese)" (?infere@TWndw@@IAEHVThipotese@@@Z)    GRAFICO.obj    OWLNextApp

    Error    67    fatal error LNK1120: 1 unresolved externals    C:\Documents and Settings\Rodrigo\Desktop\OWLNext\vc2008sln\Static Debug\OWLNextApp.exe    OWLNextApp


    Obrigado.
    Rodrigo Francisquini
    sexta-feira, 4 de setembro de 2009 03:06

Todas as Respostas

  • Rodrigo,


    Coloca o trecho do código onde está o erro pra gente dar uma olhada.



    Abraço,
    Eduardo Miranda
    sexta-feira, 4 de setembro de 2009 08:48
  • a função unsigned int stackavail( void ) está sendo chamada/usada, mas não foi encontrada pelo linker, não conseguindo gerar o executável.


    Voce esá usando OWL? Está linkando suas bibliotecas corretamente? E a library que contem essa função stackavail(..)?

    Outro problema que pode estar ocorrendo é a diferença entre usar biblotecas externas escritas em C e C++, já que C++ altera o nome das funções para suportar overloading, para controlar essa caracteristica, use exter "C" { ... }.

    Veja se esses são seus problemas, ou infome com mas detalhes para que possamos te ajudar.

    Abraço, cox

    cox
    sábado, 5 de setembro de 2009 13:35
  • O OWL está linkando corretamente sim minhas bibliotecas. Sem dúvidas disso, pois está exatamente como fala no site do OWL.

    A library que contém essa função pelo que eu ví é a malloc.h.

    Vi essa opção do extern "C" { ... }, mas não soube onde colocar.

    O código nessa parte é simples.

    int ponteiro = stackavail();


    E dá erro aí.

    Abraços.
    Rodrigo Francisquini
    sábado, 5 de setembro de 2009 20:09
  • Rodrigo,

    o erro não está no seu código, e sim na hora de linká-lo, a função não é encontrada.

    Como voce está afirmando que todas as bibliotecas estão especificadas no seu projeto, e essa função não faz parte das bibliotecas do LIBC do VC, acho que voce deve estar usando ela indevidamente. Pelo que encontrei na internet, essa função não faz parte da especificação POSIX nem ANSI/C, por tanto, acho que talvez voce deva refletir sobre o uso dela, buscando outras alternativas ou implementando o que a função faz e criando sua biblioteca.

    http://www.delorie.com/djgpp/doc/libc/libc_743.html   << esse site diz que a função não segue as especificações padrão que o VC segue.

    Outra referencia clara de queo VC não suporta essa função, deixando claro que é uma biblioteca externa que não está sendo linkada ao seu projeto, numa instalação padrão visualize o arquivo:

    c:\Program Files\Microsoft Visual Studio 9.0\VC\include\malloc.h

    e nele, veja se encontre alguma referencia a função.

    Numa procura mais ambiciosa, tente encontrar essa função especificada em qualquer .h dos includes disponíveis.

    Por isso que precisa ser clarificado se seu código fonte considera que essa função deveria estar no libc padrão que o compilador venha a usar, não é o caso do VC, mas pode ser o caso de outro. Por exemplo, voce está copiando código de um livro para testar, e o livro foi escrito usando outro ambiente. Ou pode ser que essa função esteja em outra biblioteca, externa, e que voce não esteja linkando corretamente.

    A priori, OWL é uma biblioteca de janela para Borland C, não sei como está hoje em dia.

    Abraço, cox



    cox
    • Editado cox domingo, 6 de setembro de 2009 17:12
    sábado, 5 de setembro de 2009 23:42
  • Então, tudo está especificado corretamente no meu projeto. Não sei se estou usando ela indevidamente no meu projeto, acredito que não, pois esse código era de um projeto antigo que estava rodando normalmente.

    Pelo que eu vi realmente não é pertencente ao Visual C++, mas como estava no outro projeto eu acabei só repassando o código para o Visual C++.

    Referenciada eu acho que está sim, pois está referenciado o malloc.h, e essa função stackavail() está la no malloc.h. Mas por se tratar de ser do C, não está funcionando.

    Essa funçao pega a quantidade de bytes em uma pilha. Tenho que ver com o proprietário do projeto original, até que ponto ela é imprecindível para tentar implementá-la eu mesmo.
    Queria saber se tinha outra alternativa, mas pelo visto não tem.

    A OWL está agora com um projeto chamado OWLNext, que roda em Borland C++, nos Borlands novos (2006 até o atual), e no Visual Studio 2008.

    C não é minha especialidade, mas estou tentando aqui. :)

    Obrigado pelas orientações.
    Abraços.

    Rodrigo Francisquini
    domingo, 6 de setembro de 2009 03:19
  • Rodrigo,

    realmente essa função não faz parte das bibliotecas do LIBC do VC, voce pode dizer o que voce faz com 'ponteiro' depois que ele recebe

    int ponteiro = stackavail();

    assim podemos entender qual a necessidade de saber qual o tamanho do stack segment.

    Abraços, cox


    cox
    domingo, 6 de setembro de 2009 13:43