2015-12-06 2 views
2

Я собрал dylib в Qt/C++. Я создал простой метод класса, называемый test(), который читает строковый ввод и возвращает строковый вывод с "-response" назад. Теперь, как я могу загрузить это внутри Objective C в XCode 7 (приложение Cocoa по умолчанию) и заставить его испускать test() через NSLog()?Как вызвать мой Qt/C++ Dylib из Objective C?

Это то, что моя папка сборки выглядит в Qt/C++.

enter image description here

ответ

3

Вы должны использовать Objective-C++ класс, который представляет собой гибрид Objective-C и C++.

Самая большая проблема, связанная с использованием одного или нескольких классов Objective-C++ в основном проекте Objective-C, заключается в том, чтобы не подвергать классы C++ классам Objective-C. Поэтому вам нужно избегать C++ в заголовочном файле Objective-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]; 
+0

Является ли cppclass.h заголовочным файлом моего класса Qt/C++? И как включить ссылку dylib в мой проект ObjC? И какой файл я должен использовать - я предполагаю libtestlib.1.0.0.dylib? – Volomike

+0

Я в замешательстве. Я пошел в XCode7 и добавил фреймворк libtestlib.1.0.0.dylib в Linked Frameworks и Libraries. Затем я добавил файл .h в проект. Затем, в моем файле main.m, я добавил 'import 'testlib.h" '. Он видит testlib, но класс почему-то не виден. Все, что я вижу, это: TESTLIBSHARED_EXPORT. – Volomike

+1

Да, похоже, что вы идете в правильном направлении с добавлением '.dylib' в * Link Libraries and Frameworks *, однако если' testlib.h' определяет класс C++ (или функции или использует классы C++), тогда вам понадобится переименовать 'main.m' в' main.mm'. – trojanfoe

0

Другой подход должен был бы не использовать Qt/C++, но cre ели классы C++ внутри Objective 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

Кроме того, можно (и на самом деле) смешать немного Objective C в их коде на 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 - Cocoa довольно разрежен по вариантам (смею сказать фашистский) по сравнению с Qt, поэтому я предпочитаю использовать Mac-родной WebKit внутри Cocoa, что открывает обширный набор стилей GUI. Кроме того, используя собственный WebKit Mac вместо встроенного WebKit Qt, вы можете уменьшить размер .app примерно на 30 МБ.