Framework aus beliebigem C-Code

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

  • Framework aus beliebigem C-Code

    Hallo,

    ich habe vor längerer Zeit schon einmal gelesen, dass es möglich ist, diverse OpenSource-Projekte auch in Xcode zu kompilieren. Bisher habe ich diese immer mit "configure" und "make" erstellt und anschließend einfach die Binaries aus meinen Programmen heraus aufgerufen. Gestern bin ich jedoch auf dieses Projekt gestoßen:

    malcolmhardie.com/ocr/xcode4.html

    Ich plane selbst, Tesseract in einem meiner Projekte einzusetzen, daher bin ich auf diese Seite gestoßen. Der Autor schafft es, die ganzen Libraries direkt mit Xcode zu kompilieren und daraus Frameworks zu erstellen. Gerne würde ich dies nun auch tun. Ich konnte zwar mit dem Code von der Seite die Frameworks erstellen, doch da mich diese Methode generell interessiert, habe ich versucht, dies einmal selbständig zu machen. Leider ohne Erfolg. Ich scheitere schon daran, die libjpg zu kompilieren.

    Ich habe im Netz leider nichts brauchbares gefunden, wie man solche Frameworks unter Xcode 5 erstellt. Hat jemand damit vielleicht Erfahrung?
  • Bisher gehe ich folgendermaßen vor:

    1) libjpg source entpacken und im Terminal "./configure" ausführen
    2) In Xcode New Project -> Cocoa Framework
    3) Dateien löschen: libjpg.h/.m sowie libjpg-Prefix.pch
    4) Beim Target libjpg "precompile prefix header" auf NO
    5) Im "Hauptordner" eine neue Gruppe erstellen und hierunter über "Add files to ..." den gesamten Source von libjpg hinzufügen mit "Copy items ..." und "create groups ..."
    6) Product -> Build

    Als Fehler kommt dann:

    "Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang failed with exit code 1"

    Davor eine Reihe von Fehlern wie bspw. "invalid instruction". Wenn ich im Terminal "make" eingebe, funktioniert das Kompilieren.

    War die Vorgehensweise so überhaupt richtig?
  • macmoonshine schrieb:

    Warum willst Du überhaupt ein Framework erstellen und verwendest nicht direkt libjpg.a bzw. libjpg.dylib?

    Hm, das ist wohl eine Geschmacksfrage. Ein .framework ist vielleicht etwas einfacher zu handhaben. Andernfalls habe ich ewig viele .a / .dylib-Dateien (was ist hier eigentlich der Unterschied?)

    Zu den Fehlermeldungen: Ich denke es liegt am Compiler. Bei "make" wird gcc verwendet, unter Xcode LLVM. In Xcode 5 kann ich komischerweise aber nicht auf GCC umstellen!
  • Lupurus schrieb:

    macmoonshine schrieb:

    Warum willst Du überhaupt ein Framework erstellen und verwendest nicht direkt libjpg.a bzw. libjpg.dylib?

    Hm, das ist wohl eine Geschmacksfrage. Ein .framework ist vielleicht etwas einfacher zu handhaben. Andernfalls habe ich ewig viele .a / .dylib-Dateien (was ist hier eigentlich der Unterschied?)

    Zu den Fehlermeldungen: Ich denke es liegt am Compiler. Bei "make" wird gcc verwendet, unter Xcode LLVM. In Xcode 5 kann ich komischerweise aber nicht auf GCC umstellen!


    nein, es ist wohl eher eine sache dass die leute nicht wissen was der utnerschied ist ;)

    in deinem falle ist die statische lib (.a) auf jedem fall die beste und einfachste lösung!
  • Lupurus schrieb:

    Hm, das ist wohl eine Geschmacksfrage. Ein .framework ist vielleicht etwas einfacher zu handhaben.

    Frameworks können auch Libs enthalten.

    Lupurus schrieb:

    Andernfalls habe ich ewig viele .a / .dylib-Dateien (was ist hier eigentlich der Unterschied?)

    Statisch versus dynamisch.

    Vielleicht solltest Du Dich erstmal mit Frameworks & Libs etwas näher vertraut machen sowie ein paar unspektakulärere Frameworks erstellen und einbinden, bevor Du Dich an so einen Klopper dranmachst.

    Lupurus schrieb:

    Zu den Fehlermeldungen: Ich denke es liegt am Compiler. Bei "make" wird gcc verwendet, unter Xcode LLVM. In Xcode 5 kann ich komischerweise aber nicht auf GCC umstellen!

    Kein Wunder: Unter Xcode 5 gibt es standardmäßig keinen GCC mehr.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Vielleicht solltest Du Dich erstmal mit Frameworks & Libs etwas näher vertraut machen sowie ein paar unspektakulärere Frameworks erstellen und einbinden, bevor Du Dich an so einen Klopper dranmachst.

    Ich versuch' schon lange, mich da mal einzulesen. Leider habe ich nie eine vernünftige Erklärung gefunden.


    Und warum ich das mit das mit dem Framework versuche: "configure" will unbedingt einen absoluten Pfad für den Prefix. Das ist dann natürlich ärgerlich, wenn ich die Libs später in meinem Programm verwenden möchte. Aber auch dies ist wieder ein Thema, wozu ich trotz ewigem googeln noch nie etwas gefunden habe.


    Nebenbei: Komischerweise funktioniert das Kompilieren des Xcode-Projektes von der oben genannten Seite auch mit dem LLVM. Daran kann es also nicht liegen. Ich bin gerade dabei zu schauen, was der Programmierer hier anders gemacht hat.
  • Lupurus schrieb:

    Und warum ich das mit das mit dem Framework versuche: "configure" will unbedingt einen absoluten Pfad für den Prefix.

    In der Regel wird dieser Parameter nur für die Installation gebraucht. Solltest Du aber ggf. überprüfen.

    BTW: Ich habe Tesseract unter iOS laufen. Da spielen die Installationspfade unter OSX auch keine Rolle.
    „Meine Komplikation hatte eine Komplikation.“
  • gritsch schrieb:

    Lupurus schrieb:

    macmoonshine schrieb:

    Warum willst Du überhaupt ein Framework erstellen und verwendest nicht direkt libjpg.a bzw. libjpg.dylib?

    Hm, das ist wohl eine Geschmacksfrage. Ein .framework ist vielleicht etwas einfacher zu handhaben.
    [...]

    nein, es ist wohl eher eine sache dass die leute nicht wissen was der utnerschied ist ;-)

    Och, ich persönlich finde so ein Framework schon ausgesprochen bequem. Das ewige manuelle Hinzulinken der Header nervt dann irgendwann doch extrem. :-P
    (Spiele gerade mit JNI und C-Libs rum – ich fluche. ^^)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Marco Feltmann schrieb:

    gritsch schrieb:

    Lupurus schrieb:

    macmoonshine schrieb:

    Warum willst Du überhaupt ein Framework erstellen und verwendest nicht direkt libjpg.a bzw. libjpg.dylib?

    Hm, das ist wohl eine Geschmacksfrage. Ein .framework ist vielleicht etwas einfacher zu handhaben.
    [...]

    nein, es ist wohl eher eine sache dass die leute nicht wissen was der utnerschied ist ;)

    Och, ich persönlich finde so ein Framework schon ausgesprochen bequem. Das ewige manuelle Hinzulinken der Header nervt dann irgendwann doch extrem. :P
    (Spiele gerade mit JNI und C-Libs rum – ich fluche. ^^)


    was ist daran so praktisch?

    1. werden die header meist nciht rausgelöscht (weil man zu faul ist). die braucht der endkunde nicht
    2. man muss dafür sorgen dass das ding ins fertige produkt reinkopiert wird.
    3. es wird der ganze code mit ausgeliefert der gar nicht benötigt wird
    4. funktioniert nur bei bundles

    bei statischen libs linke ich dagegen, habe die header irgendwo und das fertige produkt beinhaltet dann genau nur das was eben benötigt wird (unbenutzer code wird nicht übernommen, man braucht keine frameworks mitkopieren etc...)
  • gritsch schrieb:

    Chris schrieb:

    Marco Feltmann schrieb:


    (Spiele gerade mit JNI und C-Libs rum – ich fluche. ^^)

    Ich leide mit dir. ;)

    Chris


    warum muss man auch versuchen aus einem fertigen, funktionierendem produkt (die statische lib welche vom script erzeugt wird) ein framework zu machen?

    Ich meinte mehr JNI.

    Frameworks mache ich schon lange nicht mehr aus C-Libs. Man muss nur aufpassen dass man nicht auch die dynamischen Libs baut.
    Oder man macht gleich einen anständigen ObjC Wrapper. Aber ob sich er aufwand lohnt?

    Chris
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.
  • Chris schrieb:

    gritsch schrieb:

    Chris schrieb:

    Marco Feltmann schrieb:


    (Spiele gerade mit JNI und C-Libs rum – ich fluche. ^^)

    Ich leide mit dir. ;)

    Chris


    warum muss man auch versuchen aus einem fertigen, funktionierendem produkt (die statische lib welche vom script erzeugt wird) ein framework zu machen?

    Ich meinte mehr JNI.

    Frameworks mache ich schon lange nicht mehr aus C-Libs. Man muss nur aufpassen dass man nicht auch die dynamischen Libs baut.
    Oder man macht gleich einen anständigen ObjC Wrapper. Aber ob sich er aufwand lohnt?

    Chris


    1. vernünftigen namen verwenden (der ein eigenes kürzel enthällt, versionsnummer etc)
    2. NICHT ins system installieren (also /usr/local/lib etc)
    3. nur die stischen, nicht die dynamsichen builden (oder eben gleich löschen)
    4. lizenzen beachten ;)
  • Das mit den Header-Dateiein ist schon praktisch. Für die iOS-Version von Tesseract habe ich Tesseract und alle Bibliotheken in eine statische Lib zusammengefasst. Daraus habe ich dann ein statisches Universal-Framework zusammengeklebt. Das bisschen Mehraufwand, um aus einer Lib ein Framework zu bauen, ist unerheblich. ;)
    „Meine Komplikation hatte eine Komplikation.“
  • gritsch schrieb:

    Chris schrieb:

    Marco Feltmann schrieb:


    (Spiele gerade mit JNI und C-Libs rum – ich fluche. ^^)

    Ich leide mit dir. ;)

    Chris

    warum muss man auch versuchen aus einem fertigen, funktionierendem produkt (die statische lib welche vom script erzeugt wird) ein framework zu machen?

    Muss man nicht. Geht in diesem Fall auch gar nicht. Unter Anderem deshalb fluche ich.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P