Символ не найден, ожидается в плоском пространстве имен 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 в файле класса ObjC.

Любая помощь приветствуется.

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

Спасибо,

-S!


person Stephen Furlani    schedule 08.04.2010    source источник


Ответы (2)


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

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

person JeremyP    schedule 11.04.2010
comment
Да, на самом деле, это была проблема с пространством имен в файле .m, который включал AppController.h, из-за чего его вообще не было в двоичном файле. Однако GCC не выдавал ошибок, поэтому я понятия не имел, что не так. Спасибо. - person Stephen Furlani; 12.04.2010

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

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

person Josh    schedule 12.04.2014
comment
Это определенно помогло мне. Спасибо за подсказку. Я забыл добавить = 0 к одному из методов моего абстрактного класса. - person Stanislav Pankevich; 06.10.2017