Causas para ILINK32 erro: não resolvido externo '__fastcall System :: TObject :: NewInstance (System :: TMetaClass *)' referenciado a partir XXX.obj?
-
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:
- Este erro pode ser reproduzido não em cada máquina ou instalação C ++ Builder (Eu verifiquei pelo menos 5 deles).
- Se você remover obj-file e, em vez adicionar o arquivo pas correspondente ao projeto -. O erro desaparecerá
- Mas se você remover pas-arquivo e incluem obj-lo novamente - não haverá erro.
- 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
- 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.
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?