makefiles für Plugin's mit mehreren .h/.cpp Dateien?(Undefined symbol ...)

  • Wenn ich ein Plugin baue, welches aus Test.cpp & Test.h besteht klappt alles mit dem bauen.


    Ich habe ein makefile


    und ein keines Script mk


    was mir dann das Teil baut. Das Prog läuft auf der Box wie gewünscht.


    Wenn ich aber Klassen in andere Files auslagen möchte und diese via #include im Code einbaue kompilert (und linkt?) zwar alles wie gewünscht, wenn ich das Teil aber auf der Box starte kommt: "Undefined symbol ...".
    Also fehlt ihm die entsprechende lib (aus den ausgelagerten Klassen), bzw. sie wurde zuvor nicht gebaut?!


    Wie konfiguriere ich solche Projekte richtig? Dafür gibts doch Tools/Befehle, oder nicht? Kann ich mein makefile modifizieren, so dass es auch mit mehreren Files klar kommt?


    Ich komme aus der Windows-Entwickler-Welt und bin mit den LinuxDev-Gepflogenheiten leider nicht so vertraut ...

    2 Mal editiert, zuletzt von BadCarma ()

  • Hat niemand eine Idee? Ich habs auch schon mal mit

    Code
    ./autogen.sh
    ./config.status versucht

    ... ohne Erfolg.


    Wie erzeugt man normalerweise makefiles?

  • Damit man versteht was ich genau meine hier mal Testcode.


    Ich bekomme immer ein "Undefined symbol ..." auf der Box angezeigt, wenn ich das Plugin starte.



    Ich hab mal ein kleines Test-Plugin geschieben, indem leicht nachzuvollziehen ist, was ich meine.
    Es besteht aus:
    - test.cpp (Mainpart)
    - TestClass.cpp & TestClass.h
    - Makefile und mk Script zum kompileren


    Wenn ich nun versuche alles zu kompilieren klappt das auch ohne Fehler; starte ich das Plugin auf der Box kommt's zum o.g. Fehler "Undefined ..."


    Packe ich den Code der TestClass mit in das test.cpp & kompiliere den Kram neu läuft es auch auf der Box.


    => die includeten Datein sind nicht kompiliert/linked worden !??!?


    Weiß jemand was ich machen muß, damit das funktioniert? makefile ändern?

  • Ich häng dir mal ein Makefile an, das ich für ein eigenes Plugin mit viiiiiiielen sourcefiles benutze, hier gekürzt auf file_a.cpp und file_b.cpp, wobei file_a.cpp das file mit der plugin_exec funktion sein sollte, Pfade musst du natürlich oben anpassen.



    Die Object files werden in nem speziellen ordner (objects) gespeichert. make dreambox baut das plugin für die dreambox, make dbox für die dbox2, wobei es mittlerweile mit dem gleichen compiler auf beiden boxen laufen sollte.


    in der rule für die object files stehen in der ersten zeile die dependencies - nur wenn sich eins der dort angegebenen files im vergleich zum letzten compilen geändert hat, wird das object file neu compiled. In der rule für das "Hauptobject", also file_a.o werden außerdem alle anderen objekte gelinked mit dieser Zeile: $(CXX) -shared -Wall -mtune=405 -WI,--as-needed -Os -msoft-float -lpthread -mmultiple -mstring -g -ggdb3 -pipe -o plugin.so $(MODULESDREAM)

  • Hi dcdead,


    prima, das war genau der Tip, der mir weitergeholfen hat. Mit meinen eigenen, in extra Files ausgelagerten Klassen, funktioniert das jetzt wie gewünscht.


    Kannst du mich evtl. auch noch sagen, wie ich Bibliotheken, die ich via

    Code
    #include <jpeglib.h>

    einbinde linken (statisch?) kann.


    Kompilieren tut's wie immer nichtig, auf der Box bekomme ich aber wieder ein undefined symbol aus dieser Headerdatei.
    Muß ich das dann auch entsprechend im makefile angeben? (Ich hab schon ein paar Sachen ausprobiert, bisher aber leider ohne Erfolg)

  • Gib mal beim linken -ljpeg an, sprich so:


    $(CXX) -ljpeg -shared -Wall -mtune=405 -WI,--as-needed -Os -msoft-float -lpthread -mmultiple -mstring -g -ggdb3 -pipe -o plugin_dream.so $(MODULESDREAM)


    Müsste eigentlich so gehen, wobei ich nicht genau im Kopf hab wie die lib heisst, ob ljpeg oder ljpg

  • -ljepg war korrekt. Schönen Dank an dcdead


    Ich hatte aber noch einen anderen Fehler:


    Wenn schon

    Code
    #include <jpeglib.h>

    dann so:

    C
    extern "C" {
    #include <jpeglib.h>
    }

    dann klapps und es kommt kein

    Code
    undefined symbol: _Z14jpeg_std_errorP14jpeg_error_mgr

    mehr ... :smiling_face_with_sunglasses:

  • Sorry for writing in English , my german is "read level only" :frowning_face:


    It looks like i have the same problem with the libfx2 lib, i want to use FBdrawString function in draw.h/c i get the following message
    "/var/tuxbox/plugins/testsplugin.so: undefined symbol: _Z12FBDrawStringiiiPchh"


    any suggestion what i should add instead of -ljpeg in "$(CXX) -ljpeg -shared -Wall ..."?