RtMidi in Xcode (C++ Projekt) benutzen

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

  • RtMidi in Xcode (C++ Projekt) benutzen

    Ich wäre sehr dankbar wenn ihr mir Schritt für Schritt erklären könnte wie man die RtMidi Libary mit Xcode (C++ Projekt) verwenden kann. Ich versuche es schon seit Tagen aber bekomme immer 43 Apple Mach-O Linker (ld) Errors, wenn ich versuche das Example Programm zu starten. Was mache ich falsch? Habe doch dieses doofe __MACOSX_CORE__ im Preprocessor Macro eingetragen. Als Am aller liebsten wäre mir natürlich ein vorkonfiguriertes XCode RtMidi-Projekt wo ich dann normal programmieren kann. Ich bin sehr dankbar um eure Hilfe.
  • Hab's mal schnell ausprobiert und es sieht so aus, als ob es funkt. Kurz geschrieben was ich gemacht habe, ohne weitere Erklärungen.

    Im Terminal

    Quellcode

    1. cd rtmidi-2.1.0
    2. ./configure
    3. make


    Nun hast Du die Lib librtmidi.2.1.0.dylib und zwei symbolische Links (librtmidi.dylib und librtmidi.dylib.2).

    Erstelle ein neues Cpp-Konsolenprojekt in Xcode. Öffne die Datei z.B. testmidiprobe.cpp aus dem Ordner Test und leg den Inhalt in die Zwischenablage (alles markieren + copy). In Xcode ersetze den Inhalt der main.cpp mit dem aus der Zwischenablage (alles markieren + einfügen).

    Markiere die drei Dateien librtmidi.2.1.0.dylib, librtmidi.dylib und RtMidi.h, ziehe diese in das Xcode Projekt (beim Einfügen kopieren anklicken). Nun lässt sich das Programm fehlerfrei übersetzen. Das Ausführen funktioniert nicht, da die Bibliothek nicht in einem Standardpfad ist... Mache einen Rechtsklick auf dein Target und wähle Show In Finder aus. Kopiere librtmidi.2.1.0.dylib in das Verzeichnis. Nun lässt sich das Programm auch ausführen (klicke auf Run in Xcode).

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von manoh ()

  • Vielen Dank für deine Hilfe manoh. Leider ging trotz deiner Anleitung noch irgendwas schief. Ich bin deiner Anleitung mehrmals genau gefolgt und immer auf das gleiche Resultat gekommen: Das Programm lässt sich nun zwar ohne Fehler compilern, jedoch wird schon bald bei "0x7fff5fc0109d: nop" gestoppt. Ausserdem steht folgendes als Output:
    dyld: Library not loaded: librtmidi.2.1.0.dylib
    Referenced from: /Users/nico/Library/Developer/Xcode/DerivedData/manoh-gevntvjydsvvfpawhfnbgkqpcqhr/Build/Products/Debug/manoh
    Reason: image not found

    Dammit ihr besser nachvollziehen könnt was ich falsch gemacht habe:
    Xcode Project: nicobosshard.ch/Documents/C++/MacOSX/manoh.zip
    Screenshot:
    [Blockierte Grafik: http://www.nicobosshard.ch/Documents/C++/MacOSX/Screenshot_manoh.png]

    Bitte helft mir noch ein weiteres mal.
  • Den gleichen Fehler hatte ich auch.

    - entweder Du machst das was @macmoonshine schreibt

    - oder so wie ich es quick&dirty gelöst habe:

    ​Mache einen Rechtsklick auf dein Target und wähle Show In Finder aus. Kopiere librtmidi.2.1.0.dylib in das Verzeichnis.


    Mit Target ist auf der linken Seite unter Products dein Programm 'manoh' gemeint. Rechts klick drauf und im Finder öffnen, danach kopiere dir die Lib rein.

    PS: quick&dirty bedeutet, dass man das eigentlich so nicht macht
  • Vielen Dank! Ich bin so glücklich! Endlich geht es!!!

    Und ja ich würde mein Programm gerne einigen Personen weitergeben. Geht die quick&dirty Lösung nur bei mir? Wie gebe ich jetzt mein Programm weiter? Es sollte für meine Freunde möglichst leicht zu installieren sein da ich keine Lust habe allen bei der Installation zu helfen. Ich habe bis anhin einfach immer die .exec Datei mit den dazugehörigen Libarys als zip versendet. Wie soll ich das hier am besten machen?


    Irgendwie scheint "sudo make install" nicht zu funktionieren:[Blockierte Grafik: http://www.nicobosshard.ch/Documents/C++/MacOSX/sudo_make_install.png]
  • nicoboss schrieb:

    Wie soll ich das hier am besten machen?

    Dafür gibt es mehrere Möglichkeiten:
    1. Du kannst eine statische Lib erzeugen und einbinden, Dafür musst Du wahrscheinlich an configure einen Parameter übergeben (-enable-static). Genauere Informationen liefert configure --help. Unter Umständen hast Du die statische Bibliothek schon erzeugt; schau mal, ob es bereits eine Datei librtmidi.a gibt. Die statische Bibliothek bindest Du genauso ein, wie die dynamische.
    2. Du kannst den Loadpath der Lib über das Kommandozeilenprogamm install_name_tool(1) anpassen, und beispielsweise @executable_path/librtmidi.2.1.0.dylib verwenden. Dann muss sich die Lib im gleichen Ordner wie die App befinden.
    Variante 2 ist komplizierter als die Verwendung einer statischen Lib. Zudem hat die Verwendung einer dynamischen Lib in diesem Fall keinen wirklichen Vorteil. Ich würde also versuchen, eine statische Lib zu erzeugen und einzubinden. Aber Achtung: Der Linker bevorzugt in der Regel dynamische Libs.
    „Meine Komplikation hatte eine Komplikation.“
  • Rein Interessehalber: Darf ich mal ganz blöd fragen, warum du dir die ganze Mühe machst? Unter OSX ist RtMidi anscheinend ein ziemlich eingeschränkter Wrapper um Core MIDI, das selbst ziemlich gut ist. Und es ist schon auf allen Macs drauf. RtMidi bringt IMO nur etwas, wenn man plattformunabhängige Anwendungen schreiben will - willst du das? Oder gibt es dafür andere Gründe?
    Multigrad - 360°-Produktfotografie für den Mac
  • @mattik Ich verwende RtMidi da ich im Internet keine gute Dokumentation (Abgesehen von der Apple Referenz) sowie keine Beiprogramme in C++ gefunden habe. RtMidi kann zwar weniger aber für meine Bedürfnisse wird es reichen. Wenn du Lust hast kannst du mir aber gerne mal ein Beispielprogramm schicken. Mal ein bisschen was über CoreMidi zu lernen wäre gar nicht mal so eine schlechte Idee. Einen weiteren Grund für die Verwendung von RtMidi ist dass es durchaus sein könnte dass ich später Versionen für andere Betriebssysteme machen werde aber erst mal muss die für Mac zum laufen kriegen.

    @macmoonshine Bei ./configure --help steht nichts von -enable-static oder sonst was in dieser Art. Jedoch wenn ich anstelle von "make" "sudo make install" verwende erscheint eine librtmidi.a sowie eine RtMidi.o Datei sowie den Fehler "install: illegal option -- -" Was soll ich jetzt mit dieser librtmidi.a genau machen und braucht es dann die .dlyb noch? Jedenfalls einfach die rtmidi.h und librtmidi.a in das Projekt ziehen war nicht so erfolgreich. Und bei der 2. Möglichkeit müsste ich dann dies bei jedem Computer auf dem ich mein Programm installieren will eingeben oder wie?

    Bitte um weitere Tips wie ich RtMidi so einbinden kann dass ich es auch an anderen weitergeben kann.
  • Bei einer statischen Lib bindet er Linker die Objektdateien in die App mit ein. Du brauchst also nach dem Übersetzen und Linken nichts mehr zu machen, um die Lib zu installieren.

    Am besten nennst Du die statische Lib um (z. B. librtmidi_static.a), und ziehst sie auf das Projekt. Außerdem schmeißt Du die dynamische Lib wieder raus.
    „Meine Komplikation hatte eine Komplikation.“
  • Sorry, aber bei mir kommen nun wieder die 42 Apple Mach-o linker (Id) Errors
    Was habe ich falsch gemacht?

    Hier einige Bilder um zu sehen was ich überhaupt gemacht habe:
    [Blockierte Grafik: http://www.nicobosshard.ch/Documents/C++/MacOSX/make_install.png][Blockierte Grafik: http://www.nicobosshard.ch/Documents/C++/MacOSX/xcode_ibrtmidi_static.png][Blockierte Grafik: http://www.nicobosshard.ch/Documents/C++/MacOSX/rtmidi_folder.png]
  • du sollst die statische lib (.a) umbenennen sodass sie nicht mehr gleich heist wie die dynmische (irgedndwo im system) sonst verwendet der linker diese.
    dann muss du die statische lib in Xcode reinziehen, aber bei den zu linkenden frameworks. falls Xcode es nicht selbst macht dann musst du noch den header-search-path und den library-search-path anpassen.
  • Das mit der statischen lib geht immer noch nicht. Immer failt der Build. Ich nenne die Datei nun librtmidi_static.a und habe sie sicher schon an allen möglichen Positionen in Xcode reingezogen. Auch habe ich bei header-search-path und library-search-path den Ordner der die librtmidi_static.a hinzugefügt. Könnte mir bitte jemand mal ein vorkonfiguriertes Projekt schicken? Irgendwie scheint das mit den statischen libaries bei mir einfach nicht zu klappen.
  • Undefined symbols for architecture x86_64:
    "_AudioConvertHostTimeToNanos", referenced from:
    midiInputCallback(MIDIPacketList const*, void*, void*) in librtmidi_static.a(RtMidi.o)
    "_AudioGetCurrentHostTime", referenced from:
    midiInputCallback(MIDIPacketList const*, void*, void*) in librtmidi_static.a(RtMidi.o)
    MidiOutCore::sendMessage(std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >*) in librtmidi_static.a(RtMidi.o)
    "_CFDataGetBytePtr", referenced from:
    ConnectedEndpointName(unsigned int) in librtmidi_static.a(RtMidi.o)
    "_CFDataGetLength", referenced from:

    (...)

    "_kMIDIPropertyConnectionUniqueID", referenced from:
    ConnectedEndpointName(unsigned int) in librtmidi_static.a(RtMidi.o)
    "_kMIDIPropertyName", referenced from:
    EndpointName(unsigned int, bool) in librtmidi_static.a(RtMidi.o)
    ConnectedEndpointName(unsigned int) in librtmidi_static.a(RtMidi.o)
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
  • Habe #include <CoreAudio/CoreAudio.h> sowie #include <CoreMIDI/CoreMIDI.h> gemacht aber immer noch den gleichen Fehler. Wenn es CoreAudio brauchen würde, weshalb geht es dann mit den dynamic Libaries? Und gibt es wirklich keine einfache Möglichkeit Programme mit dynamischen Libaries auf anderen PCs zu installieren?