Bräuchte Nachhilfe: C-Bibliothek in C++ Projekt verwenden

  • Hallo,


    zur Eingewöhnung (an ffmpeg) habe ich kleinere C-Projekte gemacht, die auch soweit funktioklappten.
    Jetzt dachte ich, ich könnte die Erkenntnisse in ein C++-Projekt einfließen lassen, aber irgendwas läuft noch mächtig schief.


    Bei vielen (allen?) Funktionen erhalte ich die Fehlermeldung "undefined reference to ...".
    (aufgrund der Fehleranzahl vermute ich, dass nicht alle Funktionen nicht aufgelöst werden - ist aber wie gesagt nur eine Vermutung)


    Hm - ich dachte, wenn ich die header-Dateien mit extern "C" einbinde müsste die Namensgebung passen.


    Könnt Ihr mir bitte weiter helfen?
    Woran könnte der Linker noch scheitern, bzw. worauf muss ich noch achten?
    Die defines habe ich von ffmpeg übernommen - zumindest die, die ich ausfindig machen konnte.


    Gruß Gero

    Ich bin verantwortlich für das, was ich schreibe, nicht für das, was Du verstehst!

  • Hm - ich dachte, wenn ich die header-Dateien mit extern "C" einbinde müsste die Namensgebung passen.


    Das hängt davon ab was du da extern "C" machst. Wenn es kein C sondern C++ ist was du da referenzierst, dann hilft vielleicht das hier.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Hi Gerald,


    danke für Deine Unterstützung!


    Zitat

    Das hängt davon ab was du da extern "C" machst.


    Yo, also ich dachte mir, wenn ich die ganzen includes klammere, sollten auch die indirekten includes mit erfasst werden.
    Also z.B. so:

    C
    extern "C" {
    #include <libavcodec/avcodec.h>
    ...
    }


    Zitat

    Wenn es kein C sondern C++ ist, ...


    Hm, also bei ffmpeg bin ich mir ausnahmsweise ganz sicher ;)
    Ist sogar in den faqs zu lesen, dass die Entwickler C++ ablehnen ...


    Desgleichen bin ich mir auch ziemlich sicher, dass ich nicht der erste bin, der ffmpeg-Bibliotheken in C++ einbinden will.
    Leider konnte die Tante mit der Glaskugel mir nicht so richtig weiter helfen.


    Habe auch schon die Optionen-Liste durchwühlt, habe aber nix gefunden, was mir sagen könnte, was aufgelöst werden kann und was nicht ...
    ... und wenn ja, warum nicht?!?


    Sonst noch jemand nen Dip?


    Gruß Gero

    Ich bin verantwortlich für das, was ich schreibe, nicht für das, was Du verstehst!

  • Undefined Reference bedeutet, dass nach dem Compilieren der Linker Symbole nicht finden konnte um aus mehreren Objekt Dateien ein Binary zu bauen.
    Die Header sind nicht die Ursache, und die Frage nach C oder C++ stellt sich nicht mehr.


    Vielmehr ist sind deine Dateien schon kompiliert, d.h. dem Compiler war alles nötige bekannt und du hast fertige Objekt Dateien. Diese können wegen der Abhängigkeit von weiteren Objektdateien oder Libraries nicht gelinked werden. Such eher in Richtung Linker Flags, Makefile und benötigten libs.

  • Hm, also bei ffmpeg bin ich mir ausnahmsweise ganz sicher ;)
    Ist sogar in den faqs zu lesen, dass die Entwickler C++ ablehnen ...


    Du hast geschrieben, dass du bei vielen (allen?) Funktionen diese Meldung bekommst und nicht, dass du die Meldung bei vielen (allen?) ffmpeg-Funktionen bekommst.


    Egal, habe mich eh von deinen Aktionen mit extern "C" irritieren lassen, wirbel hat natürlich recht, du hast einfach die Libs nicht angegeben, oder doch noch ein Problem mit dem Name-Mangeling. Genaueres kann man sowieso nur sehen mit den kompletten Fehlermeldungen.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Moin moin,


    Zitat

    Undefined Reference bedeutet, dass nach dem Compilieren der Linker Symbole nicht finden konnte um aus mehreren Objekt Dateien ein Binary zu bauen.
    Die Header sind nicht die Ursache, und die Frage nach C oder C++ stellt sich nicht mehr.


    Hm, der erste Satz war klar, der zweite stimmt leider nicht, auch wenn der Compiler schon fertig war.


    Früher (tm) gab es mal die Fehlermeldung, dass der Linker die gemangelten Namen ausspuckte, sodass man schneller sehen konnte, dass der Compiler den Schaden angerichtet hat. Derzeit ist es so, dass der Linker nur den Funktionsnamen (vor dem Verwursteln) nennt, den man ja verwendet hat und auch die Zeile der Quelldatei nennt. Leider hilft das nicht wirklich weiter.


    Habe mir dann die halbe Nacht um die Ohren geschlagen und den Fehler gefunden.
    Es gab tatsächlich eine Stelle an der ich das extern "C" vergessen hatte. Unglücklicherweise hat die Stelle soviel indirekte Dateien eingebunden, dass eben die hohe Anzahl an Fehlern zustande kam.


    Ich habe meine meisten Dateien in eine Bibliothek gepackt, weil ich gemerkt habe, dass man dann auch Fehlermeldungen bei Teilen bekommt, die noch nicht verwendet werden - was bei einer "normalen" Anwendung ja nicht passiert. Also für meinen Geschmack wurde der Compiler da schon zu weit optimiert.
    Aber das mit den unterschiedlichen Bindungen ist wirklich ein Dilemma - da kann der Compiler ja garnix von wissen.
    Beim Compiler kann man ja jede Menge Schwachsinnswarnungen aktivieren - der Linker ist da leider ziemlich wortkarg. Habe keine Option gefunden, die mich hätte weiter gebracht :(


    Ack ja - nur zur Info: die Libs waren alle angegeben und auch verwendet worden. An der Stelle war kein Nachbessern notwendig.


    Es gibt einfach 2 Arten von Bibliotheken/Machern:

    • die einen gehen davon aus, dass die Bibliothek von einer Vielzahl von Menschen/Sprachen verwendet wird. Die Macher vereinfachen die Verwendung, indem sie selber schon die entsprechenden Zeilen in ihre Header packen. SDL ist da ein feines Beispiel. Perfekt!
    • die anderen sehen nur ihren eigenen Usecase und kümmern sich einen Scheiß um mögliche Anwender - wie eben ffmpeg. Sowas halte ich für egoistisch, kurzsichtig und minderwertig.


    Gruß Gero

    Ich bin verantwortlich für das, was ich schreibe, nicht für das, was Du verstehst!

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!