如何将objc程序与objc ++库接口?

时间:2012-04-22 09:03:20

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

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

提前致谢

2 个答案:

答案 0 :(得分:3)

因为我是那个让你进入(希望奖励:-))使用 Scintilla 的麻烦的人,我在这里。


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

代码大概就是这样......

<强>接口

ppScintillaEditor.mm

现在,对于实现部分,请记住使用一些初始化方法来正确设置视图(如Scintilla-cocoa附带的示例;我的意思是测试项目)


旁注:当然,您可以在#import "Scintilla/ScintillaView.h" @interface ppScintillaEditor : ScintillaView { // your iVars } // your properties / methods / whatever 课程的顶部创建子类,类别或其他内容,几乎基于您的需求 - 例如,我有创建一个单独的类别只是为了将一些ScintillaView特定命令分组(迟早,你会注意到对于一些更高级的Scintilla操作,虽然它在那里,它可能需要一些抛光来更多一点可可友好,所以你去......)


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

解决 ScintillaView,正如我在其他视频回复中所显示的那样,您所要做的就是:

  • 转到项目的构建设置
  • Apple LLVM编译器3.0 - 预处理
  • 选项预处理器宏
  • 同时添加调试发布

    "bunch of errors related to the C++ class keyword and so on"

就是这样。 : - )


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

答案 1 :(得分:1)

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

就像你已经完成的那样,但你从包装器的标题中删除了scintilla标题 - 它们只对包装器的实现可见。

<强>更新

说明一种可能的方法:

<强> 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