【问题标题】:How do i interface my objc program with an objc++ library?如何将我的 objc 程序与 objc++ 库接口?
【发布时间】:2012-05-03 05:49:40
【问题描述】:

我有一个 objc 程序,我想使用一个用 objc++ 编写的小部件(即https://launchpad.net/scintilla-cocoa)。我该怎么做?基本上我想要一个新的窗口控制器对象来与这个 objc++ 库交互来定义一个闪烁的文本编辑器小部件。简单地创建一个新的“objc 类”并从那里访问库会产生一堆与 C++ class 关键字相关的错误等等。

提前致谢

【问题讨论】:

    标签: objective-c cocoa objective-c++ scintilla


    【解决方案1】:

    既然是我让你陷入使用 Scintilla 的麻烦(希望是有益的 :-)),所以我来了。


    假设我们创建了一个ScintillaView 子类,名为ppScintillaEditor。 该文件应具有.mm 扩展名(例如ppScintillaEditor.mm

    代码大概是这样的……

    界面

    #import "Scintilla/ScintillaView.h"
    
    @interface ppScintillaEditor : ScintillaView
    {
        // your iVars
    }
    
    // your properties / methods / whatever
    

    现在,至于实现部分,记得放一些初始化方法来正确设置视图(如随附的 Scintilla-cocoa 示例;我是指测试项目)


    旁注:当然,您可以在 ScintillaView 类之上创建子类、类别或其他任何东西,这几乎取决于您的需要 - 例如,我创建了一个单独的类别只是为了将一些 ScintillaView 特定命令分组(迟早,您会注意到对于一些更高级的 Scintilla 操作,虽然它在那里,但可能需要一些抛光才能对可可更友好一点,所以给你...)


    现在,最后但并非最不重要的......

    解决"bunch of errors related to the C++ class keyword and so on",正如我在我的其他视频回复中展示的那样,您所要做的就是:

    • 转到您项目的构建设置
    • Apple LLVM 编译器 3.0 - 预处理
    • 选项预处理器宏
    • 添加到 DebugRelease

      SCI_NAMESPACE SCI_LEXER
      

    就是这样。 :-)


    提示: 以上是由 Scintilla 定义的,以避免 C 和非 C 元素之间的冲突,如上...所以,只需通知预处理器和其余部分被照顾....

    【讨论】:

      【解决方案2】:

      您将创建一个 objc 类,该类具有您的应用程序所需的接口,然后实现并添加 ivars 并实现——所有这些都在编译防火墙之后,因此 objc++ 源不包含在标头中。您的实现将提供任何必要的转换。

      就像您已经完成的那样,但是您从包装器的标头中删除了闪烁标头 - 它们仅对您的包装器的实现可见。

      更新

      为了说明一种可能的方法:

      MONScintillaWrapper.h

      // no c++/scintilla sources should be included in this header
      #import <Foundation/Foundation.h>
      
      @interface MONScintillaWrapper : NSObject
      
      - (void)setBackgroundColor:(NSColor *)pColor;    
      
      @end
      

      MONScintillaWrapper.mm

      #import "MONScintillaWrapper.h"

      @implementation MONScintillaWrapper
      {
        scintilla::t_thing scintillaThing;
      }
      
      - (void)setBackgroundColor:(NSColor *)pColor
      {
      ...convert pColor to a scintilla color and pass that to scintillaThing...
      }
      
      @end
      

      【讨论】:

      • 对不起,我还是有点不理解这个。我的实现是.mm 文件还是.m 文件?目前它只是一个.m 文件,我必须将其重命名为.mm 才能正常工作?
      • 是的 - .mm 用于此包装器对象。然后在此处声明您的 ivars(闪烁对象):@implementation MONScintillaWrapper { scintilla::t_thingy scintillaThingy; }。这样,您程序的其余部分就不需要查看您的 scintilla ivars 或 c++ 源代码。
      • 扩展答案来说明这种方法。
      • @Justin -1 是我的。但没有任何恶意。原因很简单:过去我在处理 OP 提到的完全相同的问题(集成 Scintilla 组件时为errors related to the C++ class keyword)和您的答案时遇到了一些很大的麻烦 - 尽管通常正确 - 绝对不会解决它。 (正如我在回答中提到的,它需要什么 - 至少,最好和最普遍的主题,AFAIK - 是特定于 Scintilla 的解决方法)
      • @Dr.Kameleon 解释感谢 +1
      猜你喜欢
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多