【问题标题】:Using C++ objects from Obj-C / Obj-C++ -- Calling external methods从 Obj-C / Obj-C++ 中使用 C++ 对象——调用外部方法
【发布时间】:2011-05-25 22:29:19
【问题描述】:

我在 Obj-C 代码中使用 C++ 对象。为此,我将 C++ 对象包装在 ObjC 对象中,这些对象又使用不透明指针来访问 C++ 类。那东西正在起作用。

问题: C++ 对象(例如 CPPObj.cc)使用来自其他 c++ 头文件(例如 ToolsCPP.h)的方法——当我尝试编译 ObjC 代码(例如 Obj.mm)时,它抱怨这些方法未定义。

即使我直接在 Obj.mm 文件中包含 ToolsCPP.h,它仍然会报错。

丑陋的解决方案: 在 CPPObj.cc 中包含来自 ToolsCPP.h 的所有必要方法,以便 C++ 对象完全自包含。这将是一个巨大的痛苦。

有没有更好/更容易/正确的方法来做到这一点?

谢谢!

【问题讨论】:

  • 如果您输入编译器正在编写的确切错误消息会很有帮助。

标签: c++ objective-c wrapper linker-errors opaque-pointers


【解决方案1】:

听起来您想将您的 ToolsCPP 代码(以及任何其他 C++ 依赖项)打包到一个库中,然后将其与您的 Obj-C 代码链接。

【讨论】:

    【解决方案2】:

    我不知道您看到的确切错误,但我怀疑您可能需要在 .mm 文件中使用 extern "C" 包装基于 C 的标头:

    extern "C" {
      #import "foo.h"
    }
    

    更多信息在这里: Why do we need extern "C"{ #include <foo.h> } in C++?

    【讨论】:

      【解决方案3】:

      你要么必须包装你需要的东西(例如使用 objc 方法),要么使用 objc++ 以允许客户端适当地使用 c++ 类型。

      【讨论】:

      • 作者提到文件是Obj.mm,所以看起来他用的是objc++。
      【解决方案4】:

      由于这显然是一个链接器错误,这意味着来自“ToolsCPP.cc”的代码,即对应于 ToolsCPP.h 的代码,没有被编译并与您的项目的其余部分链接。

      检查 ToolsCPP.cc 是否包含在您的项目中,并确认它实际上正在编译。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-11
        • 1970-01-01
        • 2018-02-11
        • 1970-01-01
        相关资源
        最近更新 更多