【问题标题】:Symbol Not Found, expected in Flat Namespace ObjC++未找到符号,预期在平面命名空间 ObjC++ 中
【发布时间】:2011-02-05 18:01:05
【问题描述】:

我可能遇到了一个简单的问题,但在编译过程中没有信息性错误或警告来提醒我出了什么问题。

我有一个包含 C++ 主文件和 ObjC 头文件的 Objective-C++ 应用程序。

它构建得很好,但是在运行时,它会给出以下错误消息:

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++ 经常让我头疼。

谢谢,

-S!

【问题讨论】:

    标签: c++ objective-c macos objective-c++ dyld


    【解决方案1】:

    显然缺少 AppController 类。 AppController 类是否定义在动态库的框架中?如果是这样,当您运行应用程序时,它是否知道在哪里可以找到库/框架?

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

    【讨论】:

    • 是的,实际上,这是包含 AppController.h 的 .m 文件中的命名空间问题,导致它根本不在二进制文件中。不过 GCC 没有抛出任何错误,所以我不知道出了什么问题。谢谢。
    【解决方案2】:

    不确定这是否是您的问题,但我在使用 C++ dll 时遇到了类似的问题,这花了我一整天的时间来调试。我已经有 15 年没有使用 C++ 编程了,在尝试编写纯虚函数时,我使用了熟悉的语法“virtual void f();” ——哎呀。在 C++ 中,它应该是“virtual void f() == 0;” mac OSX 10.9.2 上最新版本的 gcc 可以愉快地编译代码。

    我认为这是一个完全合法的前向声明...但是,不确定 C++ 是否允许类跨越多个文件,因此似乎应该标记这点(因为 CXX 文件中从未提供任何实现。)在任何事件,符号进入目标代码,链接器从不抱怨,所以你最终会丢失引用。希望这可以帮助某人。

    【讨论】:

    • 这绝对帮助了我。感谢您的提示。我忘了在我的抽象类的方法之一中添加= 0
    猜你喜欢
    • 1970-01-01
    • 2018-07-29
    • 2018-09-08
    • 2019-07-02
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2022-06-21
    • 2022-07-20
    相关资源
    最近更新 更多