2015-12-06 1 views
2

J'ai compilé un dylib en Qt/C++. J'ai créé une méthode de classe simple appelée test() qui lit une entrée de chaîne et renvoie une sortie de chaîne avec "-response" retour. Maintenant, comment puis-je charger cela dans Objective C dans XCode 7 (une application Cocoa par défaut) et le faire émettre test() via NSLog()?Comment faire pour appeler mon Qt/C++ Dylib de l'objectif C?

Voici à quoi ressemble mon dossier de construction dans Qt/C++.

enter image description here

Répondre

3

Vous devez utiliser un Objective-C++ classe, qui est un hybride de Objective-C et C++.

Le plus grand défi qui consiste à utiliser une ou plusieurs classes Objective-C++ dans un projet en grande partie Objective-C consiste à éviter d'exposer des classes C++ aux classes Objective-C. Par conséquent, vous devez éviter C++ dans le fichier d'en-tête Objective-C++ et simplement inclure le C++ dans le fichier d'implémentation.

Par exemple:

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 

utiliser comme ceci:

CppWrapper *cppWrapper = [CppWrapper new]; 
[cppWrapper callCppMethodA:123]; 
+0

Est-ce que cppclass.h est le fichier d'en-tête de ma classe Qt/C++? Et comment inclure le lien dylib dans mon projet ObjC? Et quel fichier suis-je censé utiliser - je suppose que libtestlib.1.0.0.dylib? – Volomike

+0

Je suis confus. Je suis allé dans XCode7 et j'ai ajouté le framework libtestlib.1.0.0.dylib sous Linked Frameworks and Libraries. Ensuite, j'ai ajouté le fichier .h au projet. Ensuite, dans mon fichier main.m, j'ai ajouté 'import 'testlib.h" '. Il voit testlib, mais la classe n'est pas visible pour une raison quelconque. Tout ce que je vois est: TESTLIBSHARED_EXPORT. – Volomike

+1

Ouais semble que vous allez dans la bonne direction avec l'ajout de '.dylib' à * Link Libraries et Frameworks *, cependant si' testlib.h' définit une classe C++ (ou fonctionne ou utilise des classes C++) alors vous aurez besoin renommer 'main.m' en' main.mm'. – trojanfoe

0

Une autre approche serait de pas utiliser Qt/C++, mais cre mangé les classes C de l'intérieur de l'objectif C et éviter Qt tout à fait, en optant pour ceux-ci inclut pour rendre la vie beaucoup plus facile en 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

De plus, on peut (et il faut effectivement) mélanger un peu d'Objective C dans leur code C++ pour faciliter la vie. Voici un exemple de fichier .mm, qui est le type de fichier qui vous permet de mélanger C++ et 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; 
    } 

}; 

Pour moi d'appeler cela de mon dossier main.m, je devais le renommer en main.mm puis faire quelque chose comme:

#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); 
} 

Ainsi, pour la plupart, il donne la facilité d'utilisation de C++, mais il est puissant avec la substance Fondation SQLite3 et Apple classe à faire à peu près ce que l'on aurait utilisé Qt pour (sans avoir à inclure de très grandes bibliothèques de frameworks d'exécution Qt). Cependant, pour l'interface graphique - Cocoa est assez rare sur les options (j'ose dire fasciste) par rapport à Qt, c'est pourquoi j'opte pour utiliser Mac WebKit natif dans Cocoa, ce qui ouvre une vaste gamme de style graphique. En outre, en utilisant Mac WebKit natif au lieu de WebKit intégré de Qt, vous pouvez réduire la taille .app d'environ 30 Mo.