Verwenden von C / C ++ statischen Bibliotheken von iPhone ObjectiveC Apps
Ist es möglich, ein C static library-API, die verwendet C++ intern und verstecken diese von den Benutzern der Bibliothek?
Habe ich geschrieben eine portable C++ Bibliothek, die ich wünschte, zu statisch link zu einer iPhone-Anwendung.
Erstellt habe ich ein Xcode-Projekt mit der Max OS X "static library" - Vorlage und kopiert die Quelle über, sowie das schreiben eines C-wapper (Umgang mit Ausnahmen) Verwendung (extern "C").
Ich versuche, um die erzeugte Bibliothek (.eine Datei in einem anderen Kakao-iPhone-Anwendung.
Alles funktioniert gut, wenn das bei mir.mm) - Erweiterungen auf die Berufung ObjectiveC-Datei und (.cpp), die auf die Implementierung der Klasse in der Bibliothek.
Aber ich bekomme nicht aufgelöste Symbole auf die Verknüpfung, wenn ich versuche, und ändern Sie die wrapper-Datei (.c) Verlängerung, obwohl alle wrapper-Funktion, die Dateien sind nur C-Funktionen.
Nur weil C++ verwendet intern in einer Bibliothek bedeutet es, dass es extern immer noch behandelt werden muss als ein C++ - Programm. Ist es nicht sowieso zur Durchsetzung dieser Abstraktion?
Edit: Danke für die Antworten,
Hatte ich mich schon mit extern "C", ich war mir nur unsicher welche Konfiguration ist, wo erforderlich, im aufrufenden Projekt. dh. wenn die aufrufende projiziert erfordern würde, um zu wissen, ob es verwendet C++ oder sein könnten, unwissend und denke es ist eine Reine C-Bibliothek.
Würde es scheinen ich kann nicht, und muss ich nutzen (.mm) Dateien auf meinem ObjectiveC Klassen.
InformationsquelleAutor der Frage Akusete | 2008-12-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist zu schwer dies zu tun in den Kommentaren, so dass ich werde einfach zu zeigen, für Sie schnell, was die Verknüpfung von Themen sind, die Sie haben. Wenn Xcode trifft auf Dateien, die es verwendet, erstellen von Regeln basierend auf dem suffix, um zu entscheiden, welcher compiler zu verwenden. Standardmäßig gcc-links der Dateien die standard-C-Bibliothek, aber nicht den link mit der standard C++ Bibliothek. Archiv-Dateien (statische Bibliotheken) haben keine Verknüpfung Auflösung. Sie sind im Grunde ein Archiv von Objekt files, die müssen verknüpft werden. Da haben Sie keine .mm oder .cpp-Dateien in Ihrem Projekt, g++ wird nie genannt, und Ihre Dateien werden nie verbunden, um die standard-Bibliotheken. Um dies zu korrigieren, fügen Sie einfach die standard-C++ - Bibliotheken, um Ihre andere linker flags in Ihrem Xcode-Projekt, oder einfach fügen Sie Sie zu den vordefinierten andere option flags wie -l (z.B., -lstdc++).
Hier ist eine kurze demonstration:
stw.h:
stw.cpp:
Aufbau der Bibliothek:
Verwenden Sie die Bibliothek aus einer C-Anwendung:
Anwendung.c:
Gebäude C Anwendung:
Wenn Sie versuchen, kompilieren Sie ohne die Option-lstdc++ Sie erhalten alle ungelösten Problemen, da der C-compiler hat absolut KEINE Idee, dass es link zu der C++ - runtime (und warum sollte es, richtig!?!?) so müssen Sie diese manuell hinzufügen. Die andere option, die Sie haben, ändern Sie die build-Regel für Ihr Projekt... anstatt Xcode mit gcc zu bauen .c und .m-Dateien, sagen, dass g++ und Ihre Probleme gelöst werden.
InformationsquelleAutor der Antwort Jason Coco
Sollten Sie erklären die Funktionen, die Sie wollen sichtbar sein
extern "C"
. Ihre Unterschriften werden müssen, um C-kompatibel, aber der Inhalt nicht (Sie können auf C++ - Objekte, zum Beispiel, aber Sie können nicht passieren Sie direkt, Zeiger sind in Ordnung). Die Symbole werden dann sichtbar für alle C-kompatible Umgebung.EDIT: Und kompilieren Sie es als C++ - source-Datei, die C nicht über den Begriff der Sprache-Verknüpfung. Es gibt ein paar andere Probleme mit der Sprache Verknüpfung (wie die Tatsache, dass alle
extern "C"
Funktionen mit dem gleichen Namen haben die gleiche Funktion, unabhängig vom namespace).EDIT2: In der überschrift können Sie prüfen, die für die makro -
__cplusplus
und verwenden Sie diese für C++ und andere Sprachen, beziehungsweise (weil C++ benötigenextern "C"
Erklärungen, und in anderen Sprachen wird wahrscheinlich beschweren sich über Sie).InformationsquelleAutor der Antwort coppro
Grundsätzlich, wenn Sie kompilieren Sie die C-Funktionen mit einem C++ - compiler, es verstümmelt Sie die Funktion Namen und verwendet das C++ - ABI.
Wenn Sie die *.cpp oder *.mm Erweiterung, die Sie verwenden, den C++ - compiler.
Was Sie tun möchten, ist Kraft, die der compiler generiert C-Funktionen mit un-mangles Namen und die Verwendung der C-ABI.
Können Sie dies tun, indem Sie entweder:
Einen Lieblings-Weg, um die header-Datei, so dass die gleiche Datei enthalten sein können aus C-und C++ - Quelldateien:
InformationsquelleAutor der Antwort Martin York
Dank, für diese gute Diskussion.
was ich getan habe ist:
1) habe ich eine statische lib verwenden cocaotouch statische lib option. In, dass ich c/c++/obj-c all-mix. aber, meine Exporte sind nur obj-c-Klassen.
Infact, die ich verwendet objc - c zu C++.
2) dann habe ich creatd iphone-app in X-code-proj.
Ich fügte hinzu, die otherlink flags meine lib-name ( -lxyz ) //meine lib name ist libxyz.ein
Ich fügte hinzu, lib Suchpfad, header search path
3) dann habe ich zusammengestellt. Ich habe Fehler.
sagen oeprator neue, operator delete nicht gefunden.
3) dann neben meiner appdelegate, view-controller, fügte ich hinzu
dummy-cpp - (.h, .cpp)...
atestdummy.h atestdummy.cpp
4) dann habe ich wieder bauen...
thats it gearbeitet.
So - ich habe auch immer Anregungen, die Sie gab früher workedfor mir.
der wesentliche Grund dafür, es sei denn, u r app sieht .cpp-Datei .mm-Datei mit cpp code
verbunden wird nicht verwende g++.
Danke an alle.
Ich habe das vorstehende gelesen und ssolved mein problem.
u die Jungs sind gut zu teilen.
InformationsquelleAutor der Antwort Nareshkumar