2010-04-08 11 views
8

Probablemente tengo lo que es un problema simple, pero no hay errores informativos o advertencias durante la compilación para alertarme sobre lo que está pasando mal.Símbolo no encontrado, esperado en el espacio de nombres plano ObjC++

Tengo una aplicación Objective-C++ que incluye un C++ principal y archivos de encabezado ObjC.

Se construye muy bien, pero cuando se ejecuta, da este mensaje de error:

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 

Ninguna cantidad de google se ha traducido en una solución, y estoy seguro de que simplemente he echado una compilación o la opción de construir algun lado.

"AppController.h" está incluido en el destino (marcado), y #import 'd en el archivo de clase ObjC.

Cualquier ayuda es muy apreciada.

ObjC++ constantemente me da dolor de cabeza.

Gracias,

-S!

Respuesta

5

Claramente, falta la clase AppController. ¿La clase AppController está definida en un marco de biblioteca dinámico? Si es así, cuando ejecuta la aplicación, ¿sabe dónde encontrar las bibliotecas/marcos?

Esto es un problema de vinculador, por cierto. Los archivos de encabezado son irrelevantes. Son los archivos .m o .mm que debes mirar.

+1

Sí, en realidad, era un problema de espacio de nombres en el archivo .m que incluía el AppController.h que hacía que no estuviera en el binario. GCC no arrojó ningún error, así que no tenía idea de qué estaba mal. Gracias. –

1

No estoy seguro de si este es su problema, pero estaba teniendo un problema similar con un dll de C++, lo que me llevó todo el día depurar. No programé en C++ por alrededor de 15 años, y al intentar escribir una función virtual pura, utilicé la sintaxis familiar "virtual void f();" - Uy. En C++ debe ser "virtual void f() == 0;" La última versión de gcc en mac OSX 10.9.2 compila alegremente el código.

Creo que es una declaración directa perfectamente legal ... sin embargo, no estoy seguro si C++ permite que las clases abarquen varios archivos, por lo que parece que esto debería marcarse (ya que nunca se proporciona implementación en el archivo CXX). cualquier evento, el símbolo lo convierte en el código objeto, y el enlazador nunca se queja, por lo que termina con la referencia faltante. Espero que esto ayude a alguien.

+0

Esto definitivamente me ha ayudado. Gracias por la pista. Olvidé agregar '= 0' a uno de los métodos de mi clase abstracta. –

Cuestiones relacionadas