Verknüpfen und Verwenden einer C ++ - Bibliothek mit einer Objective-C-Anwendung

8

Ich schreibe eine grafische Anwendung mit Objective-C für das Frontend und C ++ für die Grafikverarbeitung und Netzwerkkommunikation. Ich las auf Apples Seite nach einer Möglichkeit, entweder eine .dylib oder .so mit meinem C ++ - Code in mein Xcode-Projekt zu verlinken, aber nichts schien zu funktionieren. Ich konnte das Projekt dazu bringen, es zu referenzieren und dagegen zu verlinken, aber als ich versuchte, Funktionen von dieser .dylib aufzurufen, sagte es, dass es nicht wusste, was ich zu tun versuchte. Weiß jemand, was hier vor sich geht?

Ich weiß, dass Objective-C über alle Bibliotheken verfügt, die ich für Grafiken und Netzwerke benötige, aber ich fühle mich einfach so. Ich habe seit einiger Zeit nicht viel C ++ gemacht und möchte mehr Objective-C lernen, also welchen besseren Weg, als sie zusammen zu verwenden?

Danke, Robbie

    
Robbie 05.08.2009, 13:49
quelle

2 Antworten

13

Sie werden ein Hindernis in Form von "Name Mangling" treffen. C ++ speichert Funktionsnamen in einer Weise, die nicht mit Obj-C kompatibel ist.

Objective-C implementiert Klassen nicht auf die gleiche Weise wie C ++, daher wird es nicht so sein.

Eine Möglichkeit ist es, eine Menge einfacher C-Funktionen zu implementieren, die die C ++ - Funktionen aufrufen. Es wird eine gute Herausforderung sein, die Anzahl der C-Funktionen so gering wie möglich zu halten! Sie werden mit einer netten kompakten Schnittstelle enden! :)

Um diese Funktionen in einer C ++ - Datei zu deklarieren, müssen Sie sie mit C markieren:

%Vor%

Dies deaktiviert die standardmäßige Namensänderung.

Erstellen Sie eine Header-Datei mit den Prototypen für all diese Funktionen, die Sie mit Ihrem objektiven C-Code teilen können.

Sie können Klassen nicht auf die gleiche Weise weitergeben (weil Ihr ObjC-Code diese nicht verwenden kann), aber Sie können Zeiger übergeben (obwohl Sie möglicherweise etwas über die Typen lügen müssen) ).

    
Dave Gamble 05.08.2009, 14:02
quelle
13

Die meisten Projekte, an denen ich arbeite, haben ein ObjC-Frontend und C ++ - Backend. Wenn Sie ausschließlich mit Funktionen arbeiten, dann ist Dave Gambles Name mangle fix korrekt, aber wenn Sie mit komplexeren Situationen zu tun haben, in denen Sie ObjC- und C ++ - Objekte behandeln müssen, ist es am besten, die C ++ - Objekte zu umbrechen in ObjC-Objekten. Mit Opaque-Referenzen (was eine sehr originelle Art ist, void* zu sagen) können Sie C ++ - Objekte in ObjC übergeben und umgekehrt. Ich habe einen Beispielcode , der hilfreich sein kann.

Das heißt, für Grafiken werden Sie wahrscheinlich einen ernsthaften Leistungseinbruch bei der Erstellung von benutzerdefiniertem C ++ nehmen, anstatt Core Image und die zugehörigen Frameworks zu verwenden. Core Image und die anderen Grafikframeworks sind hochgradig für den Mac optimiert, und mit handgerolltem C ++ (oder sogar sehr gut geschriebenem C ++, das nicht speziell für den Mac entwickelt wurde) ist es sehr unwahrscheinlich. Wenn Sie auf 10,6 und den großen zentralen Dispatch umziehen, wird der Leistungsunterschied noch bemerkenswerter, weil Sie alle Parallelisierungsfortschritte verlieren, die Sie sonst kostenlos erhalten würden. Das hat nichts mit ObjC zu tun; Core Image ist C. Sie können es von C ++ aus aufrufen, wie Sie möchten. Ich empfehle nur die Bearbeitung von benutzerdefinierten Grafiken auf dem Mac in einer beliebigen Sprache, es sei denn, Sie benötigen eine Portierbarkeit oder Sie verfügen über das erforderliche Fachwissen, um Core Image zu übertreffen.

    
Rob Napier 05.08.2009 14:18
quelle

Tags und Links