如何将objc程序与objC++库联系起来?

问题描述:

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

在此先感谢

由于我把你带入使用Scintilla的的(希望奖励:-))麻烦谁的人,我在这里。


比方说,我们创建了一个ScintillaView子类,命名为ppScintillaEditor。 该文件应该有一个.mm扩展(如ppScintillaEditor.mm

的代码将大致是这样的......

接口

#import "Scintilla/ScintillaView.h" 

@interface ppScintillaEditor : ScintillaView 
{ 
    // your iVars 
} 

// your properties/methods/whatever 

现在,作为实施部分,请记住放置一些初始化方法来正确设置视图(例如伴随着Scintilla-cocoa;我的意思是测试项目)


旁注:当然,你可以创建子类,类别或任何在顶部ScintillaView类,几乎根据你所需要的 - 我举个例子,有创建一个单独的类别只是为了你可以注意到,对于一些更先进的Scintilla操作,虽然它在那里,但它可能需要一些抛光才能更可可友好,所以在这里你去...)


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

决心"bunch of errors related to the C++ class keyword and so on",正如我在其他视频回应您的评论已经证明,所有你需要做的就是:

  • 转到您的项目构建设置
  • 苹果LL VM编译器3.0 - 预处理
  • 选项预处理宏
  • 添加到这两个调试发布

    SCI_NAMESPACE SCI_LEXER 
    

就是这样。 :-)


提示:上述由Scintilla的定义,以避免C和非C元素之间的冲突,像上面...因此,所需要的是,以通知预处理器,其余是照顾....

,你会创造出具有界面的应用程序需要objc类,然后实现并添加实例变量和实施 - 一切的背后汇编防火墙,所以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

#进口“MONScintillaWrapper .H”

@implementation MONScintillaWrapper 
{ 
    scintilla::t_thing scintillaThing; 
} 

- (void)setBackgroundColor:(NSColor *)pColor 
{ 
...convert pColor to a scintilla color and pass that to scintillaThing... 
} 

@end 
+0

对不起,我仍然有点绿色遵循这一点。我的实现是'.mm'文件或'.m'文件?目前它只是一个'.m'文件,我必须将它重命名为'.mm'才能使用? – horseyguy 2012-04-22 09:19:42

+0

yes - 此包装器对象的'.mm'。然后在这里声明你的ivars(scintilla对象):'@implementation MONScintillaWrapper {scintilla :: t_thingy scintillaThingy; }'。这样,你的程序的其余部分不需要看你的scintilla ivars或C++源代码。 – justin 2012-04-22 09:39:34

+0

扩展答案来说明这种方法。 – justin 2012-04-22 09:46:59