符号未找到,预期在Flat Namespace ObjC ++中。

10

我遇到了一个可能很简单的问题,但在编译时没有任何有效的错误或警告来提醒我出了什么问题。

我的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"已被包含在目标中(已检查),并在ObjC类文件中进行了#import导入。

非常感谢任何帮助。

ObjC++经常让我头痛。

谢谢,

-S!

2个回答

6

很明显,AppController类缺失。这个AppController类是定义在一个框架或动态库中的吗?如果是的话,在运行应用程序时,它是否知道在哪里找到这些库/框架?

顺便说一下,这是一个链接器问题,头文件无关紧要。你需要查看.m或.mm文件。


2
是的,实际上,这是一个命名空间问题,出现在包含AppController.h的.m文件中,导致它根本不在二进制文件中。GCC没有抛出任何错误,所以我不知道出了什么问题。谢谢。 - Stephen Furlani

2

我不确定这是否与你的问题相关,但我曾经遇到过类似问题。我的情况是在C++ dll中,花了一整天时间进行调试。我已经有15年没有写过C++了,在尝试编写纯虚函数时,使用了熟悉的语法"virtual void f();"——糟糕了。在C++中应该是"virtual void f() = 0;"。最新版本的mac OSX 10.9.2上的gcc可以很好地编译代码。

我认为这是一个合法的前置声明...然而,我不确定C++是否允许类跨越多个文件,因此似乎应该标记这一点(因为CXX文件中从未提供实现)。无论如何,该符号进入对象代码,并且链接器从未抱怨,所以你最终会得到缺少引用的情况。希望这能帮助到某些人。


这绝对帮了我大忙。谢谢你的提示。我忘记在我的抽象类的一个方法中添加= 0了。 - Stanislav Pankevich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接