如何从Objective C调用我的Qt / C ++ Dylib?

时间:2015-12-06 18:52:04

标签: c++ objective-c xcode qt dylib

我在Qt / C ++中编译了一个dylib。我创建了一个名为test()的简单类方法,它读取字符串输入并返回带有"-response"的字符串输出。现在我如何在XCode 7(一个默认的Cocoa应用程序)中的Objective C中加载它并通过test()使其发出NSLog()

这是我的构建文件夹在Qt / C ++中的样子。

enter image description here

2 个答案:

答案 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>

string docs

stdio docs

stdio notes

sqlite3 docs

Apple Foundation Class docs

此外,人们可以(实际上必须)在他们的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。