die Verknüpfung und die Verwendung einer C++ - Bibliothek mit einem Objective-C-Anwendung
Schreibe ich eine grafische Anwendung mit Objective-C für das front-end und C++ für die Verarbeitung von Grafiken und Netzwerk-Kommunikation. Ich lese um auf der Apple-Website auf der Suche nach einem Weg, um link entweder ein .dylib oder .so mit meinem C++ - code in meinem Xcode-Projekt, aber nichts schien zu funktionieren. Ich war in der Lage, um das Projekt zu verweisen und link gegen ihn, aber wenn ich versuchte, Sie zu Anruf-Funktionen aus, die .dylib, es war zu sagen, dass es nicht wusste, was ich versuche zu tun. Weiß jemand, was ist hier Los?
Ich weiß, dass Objective-C verfügt über alle Bibliotheken, die ich hätte tun müssen, Grafik und Netzwerk, aber ich habe einfach das Gefühl, es zu tun wie diese. Ich bin noch nicht viel C++ in eine Weile und ich will mehr lernen, Objective-C, also, was besseren Weg, als Sie zusammen?
Dank,
Robbie
Du musst angemeldet sein, um einen Kommentar abzugeben.
Trifft man auf ein Hindernis in form von was nennt sich "name mangling". C++ - Funktion speichert die Namen in einer Weise, die nicht kompatibel mit Obj-C.
Objective-C nicht implementieren Klassen in der gleichen Weise, wie C++, so ist es nicht, es zu mögen.
Ein Weg, um dieses ist, um zu implementieren eine Reihe von einfachen C-Funktionen, die dem Aufruf des C++ - Funktionen. Es wird eine gute Herausforderung, um die Anzahl von C-Funktionen so gering wie möglich! Sie werden am Ende mit eine schöne kompakte Schnittstelle! 🙂
Zu erklären, diese Funktionen in einer C++ - Datei, die Sie benötigen, markieren Sie C mit:
Hierdurch wird der standard-name-mangling.
Erstellen Sie eine header-Datei mit den Prototypen für all diese Funktionen, die Sie teilen können mit Ihren objective-C-code.
Werden Sie nicht in der Lage, übergeben, um Klassen in der gleichen Weise (weil Ihr ObjC-code können Sie nicht benutzen), aber Sie werden in der Lage sein, um übergeben von Zeigern (obwohl Sie vielleicht Lügen über die Arten ein wenig).
.mm
Datei und war in der Lage, gegen die C++ - Bibliotheken perfekt, und rufen Sie die wrapper-Methoden von meinen .m
- Dateien. Danke!Meisten Projekten arbeite ich auf eine ObjC frontend und C++ - backend. Wenn man sich ausschließlich mit den Funktionen, dann Dave Gamble Namen mangle fix ist richtig, aber wenn man sich mit komplexeren Situationen, wo Sie benötigen, um mit beiden ObjC und C++ - Objekte, Ihre beste Wette ist, um wickeln Sie die C++ - Objekte in ObjC von Objekten. Mit opaken Referenzen (das ist eine sehr ausgefallene Art zu sagen
void*
), Sie können tatsächlich hand um C++ - Objekte in ObjC und Umgekehrt. Ich habe einige Beispiel-code, die hilfreich sein können.Sagte, für Grafiken, die Sie wahrscheinlich sind zu ernsthaften Leistungseinbußen erstellen benutzerdefinierter C++ eher als die Verwendung von Core Image und den zugehörigen frameworks. Core Image und der andere Grafik-frameworks sind stark optimiert für den Mac, und Sie sind sehr unwahrscheinlich, es besser zu machen mit hand-gerollte C++ (oder sogar sehr gut geschriebene C++, die nicht speziell für den Mac). Wie bewegen Sie sich auf 10.6 und grand central dispatch, der performance-Unterschied ist noch etwas erwähnenswert, weil Sie verlieren alle die Parallelisierung Fortschritte, die Sie erhalten würden, für frei sonst. Das hat nichts zu tun mit ObjC; Kern Bild C. Sie können es nennen, von C++, alle, die Sie mögen. Ich empfehle gegen custom graphics processing auf Mac in jeder Sprache, es sei denn, Sie benötigen Portabilität oder Sie haben das notwendige know-how zu schlagen, Core Image.
.m
Datei zu.mm
. So haben Sie, um Ihr Projekt zu Objective-C++ !B.h
ist Reine ObjC (erklärt kein C++), kann man absolut nennenB
ausA
. Sie absolut nicht haben, zu ändern, jede.m
zu.mm
(und sollte nicht).