如何将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
对不起,我仍然有点绿色遵循这一点。我的实现是'.mm'文件或'.m'文件?目前它只是一个'.m'文件,我必须将它重命名为'.mm'才能使用? – horseyguy 2012-04-22 09:19:42
yes - 此包装器对象的'.mm'。然后在这里声明你的ivars(scintilla对象):'@implementation MONScintillaWrapper {scintilla :: t_thingy scintillaThingy; }'。这样,你的程序的其余部分不需要看你的scintilla ivars或C++源代码。 – justin 2012-04-22 09:39:34
扩展答案来说明这种方法。 – justin 2012-04-22 09:46:59