Causas para ILINK32 erro: não resolvido externo '__fastcall System :: TObject :: NewInstance (System :: TMetaClass *)' referenciado a partir XXX.obj?

StackOverflow https://stackoverflow.com/questions/1420515

  •  07-07-2019
  •  | 
  •  

Pergunta

Estou recebendo o seguinte erro de vinculador C ++ Builder 2009 é

Unresolved external '__fastcall System::TObject::NewInstance(System::TMetaClass *)' referenced from XXX.obj?

Nós temos um conjunto de arquivos Delphi (.pas) e conjunto de arquivos C ++ Builder (.hpp e .obj), que foi gerado a partir desses arquivos .pas.

conjunto de arquivos é copiado para outra máquina. Ambos máquina tem a mesma versão C ++ Builder 2009, com as mesmas atualizações. (Mais recente: 3 + 4) instalados

Quando crio uma aplicação VCL vazia em C ++ Builder em outra máquina e incluir um arquivo obj a partir deste conjunto para o projeto ativo, fico com a acima erro mencionada no ligando palco.

As coisas estranhas sobre este erro são:

  1. Este erro pode ser reproduzido não em cada máquina ou instalação C ++ Builder (Eu verifiquei pelo menos 5 deles).
  2. Se você remover obj-file e, em vez adicionar o arquivo pas correspondente ao projeto -. O erro desaparecerá
  3. Mas se você remover pas-arquivo e incluem obj-lo novamente - não haverá erro.
  4. Nenhum dos obj de arquivos pas obtém modificado no processo. Ou seja, se você excluir este conjunto de arquivos da máquina e trazê-los a partir da primeira máquina novamente (onde eles foram criados.) - você ainda terá nenhum erro
  5. Depois de fazer isso seqüência em uma máquina particular (incluir / excluir pas-arquivo do projeto) - você não pode mais obter este erro nessa máquina, não importa o quão duro você tente (Mova arquivos entre pastas, brincar com as configurações , etc etc). Na verdade, eu já não têm máquinas, onde eu possa reproduzir este erro agora: (

Eu não ver, como situação "depois" é diferente da situação "antes" (depois / antes da inclusão de pas-file), assim o erro só é visível antes e não depois.

A única menção deste erro (ou um erro muito similar) na internet é este . Mas não há solução. Não há "+" caracteres no caminho nem espaços (" ").

Estou faltando alguma coisa? Agora parece que o C ++ Builder bug para mim.

P.S. Nós não podemos usar "apenas incluem pas-file" solução, pois precisamos implantar somente .hpp e .obj (sem arquivos .pas) a certas máquinas.

Foi útil?

Solução 3

resposta Ok, eu encontrei:. A razão era alguns ajustes do projeto do IDE ou errado (não sei ao certo)

Eu tenho diversas versões de construtores C ++ e Delphis instalado. E por alguma razão vinculador de C ++ Builder 2009 pegou arquivos obj erradas - aqueles que devem ser utilizados para outra versão (possível 2007).

A razão para o erro foi que NewInstance foi mudado entre 2007 e 2009 versões - veja aqui: https://forums.codegear.com/thread.jspa?messageID=161105

Outras dicas

Eu também estava recebendo este erro, mas era porque eu tinha esta definido:

virtual void getMaxSafeSpace();

Em vez de:

virtual void getMaxSafeSpace()=0;

Na minha classe abstrata.

parece que se você construir o projeto a partir dos arquivos pas, em seguida, uma cópia da função '__fastcall System :: TObject :: NewInstance (System :: TMetaClass *)' está sendo definido em algum lugar, mas não nos arquivos obj, e ligado ao binário. Uma vez que a função é definida, em seguida, o arquivo XXX.obj encontra. Então, se você excluir arquivos obj atuais e trazer obj arquivos de outra máquina, o erro não é visto. Este é apenas o meu pensamento. Eu nem sei Delphi nem ter qualquer ideia sobre arquivos pas ou C ++ Builder.

O seu projecto é a criação de dll ou algum tipo de bibliotecas externas, onde System :: TObject :: NewInstance () função é definida e ligada ao binário?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top