我在Qt / C ++中编译了一个dylib。我创建了一个名为test()
的简单类方法,它读取字符串输入并返回带有"-response"
的字符串输出。现在我如何在XCode 7(一个默认的Cocoa应用程序)中的Objective C中加载它并通过test()
使其发出NSLog()
?
这是我的构建文件夹在Qt / C ++中的样子。
答案 0 :(得分:3)
您需要使用Objective-C ++类,它是Objective-C和C ++的混合体。
在一个主要的Objective-C项目中使用一个或多个Objective-C ++类的最大挑战是避免将C ++类暴露给Objective-C类。因此,您需要在Objective-C ++头文件中避免使用C ++,只需在实现文件中包含C ++。
例如:
CppWrapper.h:
#import <Foundation/Foundation.h>
@interface CppWrapper : NSObject
- (BOOL)callCppMethodA:(int)param;
@end
CppWrapper.mm:
#import "CppWrapper.h"
#import "cppclass.h" // C++
@interface CppWrapper()
{
cppclass *_cppclass; // C++
}
@end
@implementation CppWrapper
- (id)init
{
self = [super init];
if (self) {
_cppclass = new cppclass(); // C++
}
return self;
}
- (void)dealloc
{
delete _cppclass; // C++
}
- (BOOL)callCppMethodA:(int)param
{
return _cppclass->methodA(param); // C++
}
@end
像这样使用:
CppWrapper *cppWrapper = [CppWrapper new];
[cppWrapper callCppMethodA:123];
答案 1 :(得分:0)
另一种方法是不使用Qt / C ++,但是在Objective C中创建C ++类并且完全避免Qt ,选择这些包括在C ++中使生活变得更加容易:
#include <string>
#include <stdio.h>
#include <sqlite3.h>
#include <Foundation/Foundation.h>
此外,人们可以(实际上必须)在他们的C ++代码中混合一点Objective C,以使生活更轻松。这是一个示例.mm
文件,它是允许您混合C ++和Objective C的文件类型:
#include <string>
#include <stdio.h>
#include <sqlite3.h>
#include <Foundation/Foundation.h>
class Testlib {
public:
std::string test(std::string sIn) {
sIn = sIn.append("-response");
return sIn;
}
NS_RETURNS_RETAINED NSString *test2(NSString *sIn) {
// note [[funky Objective C syntax]]
NSString *sOut = [[NSString alloc] init];
sOut = [NSString stringWithFormat:@"%@-response", sIn];
return sOut;
}
};
为了让我从main.m文件中调用它,我必须将其重命名为main.mm然后执行以下操作:
#import <Cocoa/Cocoa.h>
#import "testlib.mm"
int main(int argc, const char * argv[]) {
// demo Testlib out to the debug log
Testlib *o = new Testlib();
std::string s = "";
s = o->test("request");
NSLog(@"Result=%s",s.c_str());
NSLog(@"Result2=%@",o->test2(@"request"));
// load our GUI
return NSApplicationMain(argc, argv);
}
因此,在大多数情况下,它提供了C ++的易用性,但是使用SQLite3和Apple Foundation Class的功能非常强大,可以完成人们使用Qt的功能(无需包含非常大的Qt)运行时框架库)。但是,对于GUI来说,与Qt相比,Cocoa的选项相当稀少(我敢说法西斯主义者),这就是为什么我选择在Cocoa中使用Mac原生WebKit,这开辟了大量的GUI样式。此外,通过使用Mac原生WebKit而不是Qt的嵌入式WebKit,您可以将.app
大小减少大约30MB。