2010-04-08 4 views
8

У меня, вероятно, есть простая проблема, но во время компиляции нет никаких информационных ошибок или предупреждений, чтобы предупредить меня о том, что происходит не так.Символ не найден, ожидаемый в пространстве пространств имен ObjC++

У меня есть приложение Objective-C++, которое включает в себя основные файлы заголовков C++ и ObjC.

Он строит хорошо, но при запуске он дает следующее сообщение об ошибке:

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 

Никакое количество не прибегая к помощи привело к решению, и я уверен, что я просто пропустил компиляции или построить вариант где-то.

«AppController.h» включен в цель (отмечен) и #import 'd в файле класса ObjC.

Любая помощь очень ценится.

ObjC++ постоянно дает мне головную боль.

Thanks,

-S!

ответ

5

Очевидно, что класс AppController отсутствует. Является ли класс AppController определенным в рамках динамической библиотеки? Если это так, когда вы запускаете приложение, знает ли он, где искать библиотеки/фреймворки?

Это, кстати, проблема с компоновщиком. Файлы заголовков не имеют значения. Это файлы .m или .mm, которые вам нужно посмотреть.

+1

Да, на самом деле это была проблема пространства имен в файле .m, который включал AppController.h, из-за чего он не был в двоичном виде вообще. GCC не ошибался, поэтому я понятия не имел, что случилось. Спасибо. –

1

Не уверен, что это ваша проблема, но у меня была аналогичная проблема с dll C++, которая потребовала меня весь день для отладки. Я не программировал на C++ около 15 лет, и, пытаясь написать чистую виртуальную функцию, я использовал знакомый синтаксис «virtual void f();» - Упс. В C++ это должно быть «virtual void f() == 0;» Последняя версия gcc на Mac OSX 10.9.2 с радостью компилирует код.

Я думаю, что это совершенно законная декларация о просрочке ... однако, не уверен, что C++ позволяет классам охватывать несколько файлов, поэтому кажется, что это должно быть помечено (поскольку в CXX-файле никогда не выполняется реализация). любое событие, символ превращает его в объектный код, и компоновщик никогда не жалуется, поэтому вы получаете недостающую ссылку. Надеюсь, это поможет кому-то.

+0

Это определенно помогло мне. Спасибо за подсказку. Я забыл добавить '= 0' к одному из методов моего абстрактного класса. –

 Смежные вопросы

  • Нет связанных вопросов^_^