Code per makefile

  • Code per makefile

    Hallo,
    zuerst: Ich bin neu beim Mac, von daher seht es mir nach, wenn die Frage zu dumm ist.

    Zu meinem Problem:
    Ich habe hier ein OS 10.6.2 und eine C++ Applikation. Diese ist ein Kommandozeilenprogramm.
    Ich arbeite mit einem makefile. Diese makefile liegt am Server und hat Ziele wie
    make win
    make lin
    die die Windows und Linuxversion generieren

    Nun an sich läuft das Programm auf meinem Entwickler-Mac (also make mac), aber auf nem 10.5.8 geht das nicht.

    Es kommt die Meldung: unkown required load command 0x8000022

    Ich möchte die Applikation für alle Plattformen lauffähig machen (auch Prozessorarchitekturen).
    Gibt es da Compilerswitches. Derzeit arbeite ich mit
    -mmacosx-version-min=10.4 -no_compact_linkedit

    Außerdem nutze ich die Boostbibliothek (programm_options). Leider hat die 1.33.1, mit der arbeiten möchte, nicht compiliert, Die 1.38 schon, aber das ist etwas ungünstig, da ich alle Plattformen auf dem gleichen Stand haben möchte.

    Insgesamt möchte ich die Bibliotheken statisch linken, aber auch hier habe ich Schwierigkeiten. -static geht leider nicht.

    Also bräuchte ich Hinweise:
    1. Multiplattformentwicklung
    2. Binden von Bibliotheken, so dass das Programm auf jeden Mac lauffähig ist
    3. Compilieren der 1.33.1, so dass diese eine statisch linkbare Lib für alle Plattformen generiert.
    4. alles als optionen für den gcc für das makefile.
    Vielen Dank für Eure Hilfe
    Michael
  • Original von enertegus
    Hallo,

    Ich hab nunmal schon makefiles für die anderen Plattformen. Wenn ich nun hier komplett anders verfahre halte ich das für eine schlechte Strategie.
    Es muss sich ja letztlich um Compileroptionen handeln, die es nur zu wissen gilt...


    Ja, würde ich auch so sehen. Hast Du Dir den Link mal durchgelesen?

    Alex
    The only thing that really worried me was the ether.
  • Original von below
    Ja, würde ich auch so sehen. Hast Du Dir den Link mal durchgelesen?
    Alex

    Hab ich, allerdings war das auch nur so zum Teil hilfreich, weils ja da darum geht, wie ich mit dem XCode arbeiten kann, aber nicht mit dem makefile. Und ich will ja nur eine einfache Konsolenapp nutzen ...

    Immerhin war der Tipp mit dem isysroot schon ganz passend. Ich habe das SDK 10.6 eingebunden und nun auf ner OS10.5 einen Linker Fehler

    ( dyld: lazy symbol binding failed: Symbol not found:
    __ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i
    Referenced from: /Users/test/desktop/eibparser.bin
    Expected in: /usr/lib/libstdc++.6.dylib)

    Heisst dass, nehme ich SDK 10.5, dann geht's auch damit (bezieht sich SDK auf OSX Variante? Kann ich von hier nimmer ausprobieren...

    Nun wenn das läuft, muss ich nur noch die ppc Variante ausführen.
  • Original von enertegus
    Heisst dass, nehme ich SDK 10.5, dann geht's auch damit (bezieht sich SDK auf OSX Variante? Kann ich von hier nimmer ausprobieren...

    Nun wenn das läuft, muss ich nur noch die ppc Variante ausführen.


    Das -isysroot bezeichnet das SDK, gegen das Du linkst. Die sind -- im Normalfall -- abwärtskompatibel, d.h. wenn Du willst, dass Deine Software auch mit dem 10.5er SDK bauen. Es läuft dann auch auf 10.6

    Für PPC wird es etwas haarig. Du musst den ganzen Prozess noch einmal machen, diesmal mit dem gcc und ld flag "-arch ppc" (am besten gibst Du im anderen Fall auch ein "-arch i386" mit, falls jemand Dein Makefile mal auf einem PPC laufen lässt).

    Die entstandenen Binaries musst Du dann mit dem Befehl lipo zu einem Universal Binary zusammenfügen.

    Alex
    The only thing that really worried me was the ether.
  • Original von below
    Das -isysroot bezeichnet das SDK, gegen das Du linkst. Die sind -- im Normalfall -- abwärtskompatibel, d.h. wenn Du willst, dass Deine Software auch mit dem 10.5er SDK bauen. Es läuft dann auch auf 10.6

    Für PPC wird es etwas haarig. Du musst den ganzen Prozess noch einmal machen

    Die entstandenen Binaries musst Du dann mit dem Befehl lipo zu einem Universal Binary zusammenfügen.

    Alex

    Cool, dann stimmt also die Vermutung Version SDK = Version OSX.
    War mir nicht klar.

    Das mit der Library und dem lipo hab ich schon gefunden. Mit makefile kenn ich mich gut aus (komm ja aus der Linuxwelt), so dass ich das alles in ein wunderschönes makefile packen kann.

    Danke für Eure Hinweise
  • Du solltest bedenken, dass unter Umständen für verschiedene Architekturen verschiedene SDKs genommen werden sollen/können.

    Im Prinzip kannst Du für PPC ab 10.2 bauen (problemlos ab 10.4, alles davor erfordert dann zum Beispiel gcc 3.x), für Intel brauchst Du gcc 4 und OS X 10.4.

    Für 64 Bit brauchst Du IIRC gcc 4.2 und mindestens OS X 10.5

    Alex
    The only thing that really worried me was the ether.
  • Hallo miteinander,
    das hat nun wunderbar geklappt.

    Für alle, die das auch mal brauchen sollten:
    Ich habe mich entschlossen zunächst zwei Bins zu machen:

    Im Makefile für den gcc:
    -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5 -arch i386
    und
    -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5 -arch ppc
    jeweils für das geünschte Target ergänzen.

    Man beachte, die Versionsnummer des SDK ist die des OSX.

    Anschließend mit dem Befehl lipo zusammen binden.

    Wenn man aus der Unixwelt kommt und nur für die Kommandozeile "lebt", ist das optimal einfach und ausreichend.

    Gruss
    Michael
  • Original von enertegus
    Original von below
    Es empfiehlt sich, auch immer -mmacosx-version-min anzugeben.
    Alex

    hab ich doch...


    Ja, hast Du, brav.

    Aber da Du so eine hübsche Anleitung geschrieben hast wollte ich das noch hinterherschieben. Das geht in Deinem ersten Post ein bischen unter.

    @tjp: Rischtisch! Ich denke halt zu sehr in Cocoa...

    Alex
    The only thing that really worried me was the ether.
  • Original von enertegus
    Original von tjp
    Original von below
    Für 64 Bit brauchst Du IIRC gcc 4.2 und mindestens OS X 10.5

    Für eine reine UNIX Anwendung reicht auch 10.4 aus. Die ganzen Cocoa Sachen gibt es erst ab 10.5

    Wobei ich mit dem XCODE und meinem OSX nur SDK 10.5 habe. Von daher kann ich das auch nicht unterstützen.


    bei der installation von Xcode (So heist es richtig) hättest du das 10.4er SDK zur installation auswählen können (wird mit Xcode 3.2 default-mäßig wohl nicht installiert)
  • Original von enertegus
    Original von gritsch
    bei der installation von Xcode (So heist es richtig) hättest du das 10.4er SDK zur installation auswählen können (wird mit Xcode 3.2 default-mäßig wohl nicht installiert)

    ich schau mal, ob ich das nachinstallieren kann. danke für den tipp.


    Du kannst.

    Alex
    The only thing that really worried me was the ether.