Símbolo não encontrado, esperado no espaço de nome plano Objc ++
-
25-09-2019 - |
Pergunta
Eu tenho provavelmente o que é um problema simples, mas não há erros ou avisos informativos durante a compilação para me alertar sobre o que está dando errado.
Eu tenho um aplicativo Objective-C ++ que inclui arquivos de cabeçalho principal do C ++ e OBJC.
Ele constrói bem, mas quando executado, fornece esta mensagem de erro:
Dyld Error Message:
Symbol not found: _OBJC_CLASS_$_AppController
Referenced from: /Users/slate/Documents/osirixplugins/eqOsirix/build/Development/rcOsirix.app/Contents/MacOS/rcOsirix
Expected in: flat namespace
in /Users/slate/Documents/osirixplugins/eqOsirix/build/Development/rcOsirix.app/Contents/MacOS/rcOsirix
Nenhuma quantidade de Google resultou em uma solução e tenho certeza de que acabei de perder uma opção de compilação ou construção em algum lugar.
"AppController.h" está incluído no alvo (verificado) e #import
'D no arquivo da classe OBJC.
Qualquer ajuda é muito apreciada.
OBJC ++ constantemente me dá dor de cabeça.
Obrigado,
-S!
Solução
Claramente, falta a classe AppController. A classe AppController está definida em uma estrutura de biblioteca dinâmica? Se sim, quando você executa o aplicativo, ele sabe onde encontrar as bibliotecas/estruturas?
A propósito, esta é uma questão de vinculador. Os arquivos de cabeçalho são irrelevantes. São os arquivos .m ou .mm que você precisa olhar.
Outras dicas
Não tenho certeza se esse é o seu problema, mas eu estava tendo um problema semelhante com uma DLL C ++, o que me levou o dia todo para depurar. Não programei em C ++ há cerca de 15 anos e, enquanto tentava escrever uma função virtual pura, usei a sintaxe familiar "virtual void f ();" - Oops. Em C ++, deve ser "Void virtual f () == 0;" A versão mais recente do GCC no Mac OSX 10.9.2 compila feliz o código.
Eu acho que é uma declaração para a frente perfeitamente legal ... no entanto, não tenho certeza se o C ++ permite que as classes abranjam vários arquivos, por isso parece que isso deve ser sinalizado (pois nenhuma implementação é fornecida no arquivo CXX.) Em qualquer caso, o O símbolo entra no código do objeto, e o vinculador nunca reclama, então você acaba com a referência ausente. Espero que isso ajude alguém.