C++ Lib to objC

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • C++ Lib to objC

    Hallo Liebe ObjC Freunde,

    ich bin ganz neu hier und hoffe das ich hier ein gutes Anlauf-Forum für ObjC gefunden habe.

    Ich bin ganz neu in ObjC(CodeX), naja ok vielleicht eine Woche habe ich hinter mir und meine erste iPhone-Mini-Tutorial Anwendung geschrieben, nichts Welt bewegendes.
    Eigentlich komme ich aus dem Java Sektor und soll jetzt umgepoolt werden :D aber zu meiner Frage:

    Ich habe eine C++ H/CPP Datei. Diese soll als eine LIB erstellt werden. Jetzt soll ich diese C++ LIB in meinem ObjC Code benutzen und die Methoden daraus aufrufen können.
    Und genau da gehts schon los :(...

    1. Wie erstelle ich eine "richtige" Lib für den Mac? Habe hier ein Makefile bekommen, das eine *.so schreiben kann, ist das am Ende egal?
    2. Wie binde ich die LIB richtig ein?
    Dazu habe ich schon gesehen "Frameworks" Add Framework, und dann das File auswählen, reicht das?
    3.Wie rufe ich es in meinem objC Code auf? Was und wie muss ich es dann import'en ?
    4.Brauche ich noch eine seperates Header (c++) File in meinem "Workspace" oder sollte das aus der LIB reichen?

    Wenn ich euch zu wenig Infos gegeben habt, bitte nachfragen, ich kenne mich halt noch nicht so gut aus :(

    Aber schonmal vielen Dank!
  • Das hatte ich schon probiert und ging auch erfolgreich, aber die wollen das hier mit einer "einheitlichen" LIB machen. Die für verschiedene Systeme am ende benutzt werden kann ... ich könnte man fragen, ob wirs auch ohne machen können ,... aber das muss es doch geben oder? Habe schon ein paar beiträge dazu gefunden, aber nichts konkretes. Naja morgen gehts weiter.
  • Ich hab hier mal ein mini-beispiel gebaut und angehängt. Darin sind drei Makefiles,
    Makefile.nolib kompiliert einfach alles, ohne libs
    Makefile.static erzeugt eine static library (lib.a) und linkt die Anwendung dagegen
    Makefile.dynamic erzeugt eine dynamic lib (libtest.dylib) und linkt die Anwendung dagegen

    Frag mich nicht, wie man das mit Xcode macht, aber da gibt es denke ich auch Templates für.

    Ein paar wichtige Anmerkungen:
    - Wenn Du C++ Libraries hast, kommst Du nicht umhin, dein Objective-C-code in .mm (also Objective-C++) umzubenennen, um das Ganze auch benutzen zu können. Alternativ bleibt nur die Möglichkeit, reine C-Wrapper für Deine C++ Funktionen zu erstellen, die Du dann auch vom "normalen" Objective-C rufen kannst.
    - Dylibs sind anstrengend (DLL-Hell...), du musst immer aufpassen, gegen welche Lib gelinkt wurde, mit welchen Pfaden etc. Siehe dazu bspw. install_name_tool
    C++
  • macmoonshine schrieb:

    Erstelle Dir in Xcode doch einfach ein entsprechendes Projekt und lege Deine C++-Datei da rein.

    Ich denke Du meinst:

    zerm schrieb:

    Frag mich nicht, wie man das mit Xcode macht, aber da gibt es denke ich auch Templates für.

    Hab grad geschaut, da gibs wirklich einfach Templates für, musst Du schauen. Interessanterweise keine C++ static. Mhh.
    Also etwa in Xcode -> New Project -> MacOS X -> Framework & Library -> STL C++ Library (dynamic)
    C++
  • So ich probiere gerade das STL C++ Library aus.

    Habe meine C++/H Dateien in das Projekt gezogen und die

    #pragma GCC visibility push(visibility) #pragma GCC visibility pop

    gesetzt und es anschleißen gebaut. Fällt eine *.dylib Datei dabei raus. Diese füge ich jetzt zu meinem richtigen Projekt in den "Frameworks" hinzu.

    Und wie importe ich jetzt die Klasse? Er schlägt mir auch zum Teil nich alte Header Files vor, die ich schon längst aus dem Projek gelöscht habe ~.~
  • Die Header musst Du bei einer dylib händisch inkludieren. Müssen halt entweder im Suchpfad liegen, oder Du erweiterst den Suchpfad insoweit als dass er sie findet.
    Um das zu "vereinfachen" gibt es ja Frameworks. Das sind im Prinzip auch nur dylibs, aber in einer netten Verzeichnistruktur wo die Header gleich mit dabei sind. Von daher solltest Du vielleicht einfach ein Framework bauen und verwenden, könnte etwas einfacher sein.
    C++