externe Librarie verwenden...wie??

  • Hi


    sry für die wahrscheinlich dumme Frage...


    Wie verwende ich bei C++ eine externe Library wie libcurl??


    Will ein eigenes Plugin schreiben, welches die libcurl verwendet, habe schon

    Code
    #include <curl/curl.h>


    in der c-Datei und

    Code
    INCLUDES += $(curl-config --cflags)
    LIBS += $(curl-config --libs)


    und $(LIBS) in

    Code
    all: libvdr-$(PLUGIN).so
    
    
    libvdr-$(PLUGIN).so: $(OBJS) $(LIBS)
    	$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
    	@cp $@ $(LIBDIR)/$@.$(VDRVERSION)


    in dem Makefile.ergänzt. Nun kompiliert er zwar durch, aber es kommt beim start von vdr:

    Code
    vdr: /usr/lib/vdr/libvdr-webepg.so.1.3.42: undefined symbol: curl_global_cleanup


    curl_global_cleanup ist eine Funktion der libcurl. Habe bisher kaum C++ geschrieben, nur Pascal, muss aber für VDR ja leider C++ verwenden...


    Habe ich noch etwas wichtiges vergessen?? Im Makefile oder so??

    VDR: AMD A4-3400, 4096 MB RAM, Technisat SkyStar HD2, Technisat Skystar USB HD
    openSUSE 13.1, VDR 2.0.4, vdr-xineliboutput

  • Zitat

    Original von balta

    Code
    all: libvdr-$(PLUGIN).so
    
    
    libvdr-$(PLUGIN).so: $(OBJS) $(LIBS)
    	$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
    	@cp $@ $(LIBDIR)/$@.$(VDRVERSION)


    Es nutzt nicht viel wenn Du die LIBS bei den Abhängigkeiten des Plugins notierst, deshalb werden sie noch nicht automatisch dazugelinkt ;) $(LIBS) muss auch (oder besser nur) beim $(CXX) Befehl stehen

  • danke für die schnelle antwort... wie gesagt, makefiles und c++ sind für mich noch ziemlich neuland, weiß wie man sie verwendet, aber nicht so wie man sie schreibt...hatte das irgendwo anders abgeguckt.


    ich habes jetzt so gemacht:

    Code
    libvdr-$(PLUGIN).so: $(OBJS)
    	$(CXX) $(CXXFLAGS) -shared $(OBJS) $(LIBS) -o $@
    	@cp $@ $(LIBDIR)/$@.$(VDRVERSION)


    trotzdem dasselbe...


    finde im übrigen bei der Ausgabe von make nichts von der curl-config-Ausgabe:

    Code
    g++ -fPIC -g -O2 -Wall -Woverloaded-virtual -c -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"webepg"' -I../../../include -I../../../../DVB/include  webepg.c
    g++ -fPIC -g -O2 -Wall -Woverloaded-virtual -shared webepg.o  -o libvdr-webepg.so


    müsste dazwischen jetzt nicht auch folgendes stehen?? (Ausgabe von curl-config --libs)

    Code
    -L/usr/lib64 -lcurl -L/usr/ssl/lib -lssl -lcrypto -ldl -lz

    VDR: AMD A4-3400, 4096 MB RAM, Technisat SkyStar HD2, Technisat Skystar USB HD
    openSUSE 13.1, VDR 2.0.4, vdr-xineliboutput

    Einmal editiert, zuletzt von balta ()

  • Dem Leerzeichen zwischen wegepo.o und -o nach zu urteilen wird dort etwas eingesetzt - nämlich ein leerer String.


    Irgendwas geht bei dem curl-config Aufruf schief oder die Variable LIBS wird im Makefile später überschrieben.

  • habe gerade beim text2ski-makefile entdeckt, dass bei LIBS += $(curl-config --libs) ein shell fehlt, also:


    Code
    LIBS += $(shell curl-config --libs)


    Jetzt ist es bei der Ausgabe dabei...ob es funktioniert kann ich gerade nicht testen da ich Hot Shots 2 aufnehme...werde danach aber gleich berichten...

    VDR: AMD A4-3400, 4096 MB RAM, Technisat SkyStar HD2, Technisat Skystar USB HD
    openSUSE 13.1, VDR 2.0.4, vdr-xineliboutput

  • eine Frage habe ich doch noch... wie kann ich einen int-Wert in char umwandeln?? Habe da im Netz irgentwas mit sprintf oder itoa gefunden, was aber nicht richtig funktionieren will...
    Da lob ich mir Pascal mit StrToInt, IntToStr...


    Edit:


    Und noch was zweites: Kann man chars nicht einfach mit + adieren?? Also

    Code
    printf("Hallo"+"Welt")


    Das würde in Pascal so gehen...

    VDR: AMD A4-3400, 4096 MB RAM, Technisat SkyStar HD2, Technisat Skystar USB HD
    openSUSE 13.1, VDR 2.0.4, vdr-xineliboutput

    Einmal editiert, zuletzt von balta ()

  • Zu 1.)


    sprintf(char, "%d", int);


    printf("%s\n", char);



    Zu 2.)


    Ja , wenn du die Ansi String Class anwendest , dann geht das auch so ;)


    <string>


    using namespace std;



    int main()
    {


    std::string Result ("Hallo");


    Result=Result + " Welt";
    printf( "%s\n",Result.c_str() );
    }


    Da mehr und besser erklaert:
    http://www.msoe.edu/eecs/ce/courseinfo/stl/string.htm


    ..ansonsten bleibt noch.


    strcpy(input, output);


    Btw. was machst du denn gerade , neugierig frag...

  • Ich versuche mich gerade an einem Plugin, dass die EPG-Daten von den Webseiten der Sender holt, wenn diese keinen senden. Als erstes versuche ich es mit GIGA, danach kommen wohl aber noch mehr dazu... Kann aber vll noch dauern, da es a) des erste Plugin ist was ich schreibe und b) das erste c++-Programm ist, das ich schreibe. Es wird wohl sowas ähnliches werden wie tvmovie2vdr, nur als Plugin und nicht von tvmovie...


    Hab gerad egesehen... bin wohl zu blöd für c++


    Habe folgendes:



    und habe folgende Probleme:


    a)er gibt nur folgendes aus:

    Code
    webepg: Debuglevel ý set


    Interessanterweise kommt beim kopieren dieses Textes in Firefox dieses ý, in der Konsole ist es ein Leerzeichen. Geht wohl beim Umwandeln von char nach int was schief.


    b)wenn ich in Zeile 12 das auskommentierte atoi statt 1 nehme, dann kommt ein Speicherzugriffsfehler beim Start von vdr.

    VDR: AMD A4-3400, 4096 MB RAM, Technisat SkyStar HD2, Technisat Skystar USB HD
    openSUSE 13.1, VDR 2.0.4, vdr-xineliboutput

    5 Mal editiert, zuletzt von balta ()

  • KAnnst ja mal testen :

    Code
    char *buf;
    DebugLevel = 1;
    asprintf(&buf,"webepg: DebugLevel %i set", DebugLevel);
    printf("%s\n", buf);
    free(buf);


    oder warum nicht gleich :


    DebugLevel = 1;
    printf("webepg: DebugLevel 1 set\n");



    3x editiert :S
    ;)

  • Hi


    Danke der obere Weg geht!


    Zitat

    oder warum nicht gleich :


    DebugLevel = 1;
    printf("webepg: DebugLevel 1 set\n");


    Das geht aus zwei schon genannten Gründen nicht:


    a) Ich sehe dieses Plugin als Einübung in C++, und da ich solchen Konvertierungen noch öfter begegnen werde will ich jetzt lernen wie das geht.


    b) Eigentlich soll statt

    Code
    Debuglevel = 1;

    dort folgendes hin:

    Code
    Debuglevel = atoi(optarg);


    Allerdings kommt dann immer ein Speicherzugriffsfehler beim Start von VDR ;(

    VDR: AMD A4-3400, 4096 MB RAM, Technisat SkyStar HD2, Technisat Skystar USB HD
    openSUSE 13.1, VDR 2.0.4, vdr-xineliboutput

  • hallo balta,


    wenn du willst, kannst du ja nochmal den aktuellen code posten, dann wird sich mit sicherheit der fehler finden lassen.


    falls du selber noch suchen willst, kannst du ja bei kurzem code einfach ein paar


    ...
    printf("aktiv 1\n");
    ...
    printf("aktiv 2\n");
    ...


    einbauen, dann findest du ziemlich schnell den segfault.


    bei längerem code wuerde ich einen backtrace durchführen.



    gruesse
    herbsl

  • optarg ist vermutlich leer, deshalb der Crash. Wenn man will dass eine Option einen Paramater braucht muss in den Getopt-String noch ein : hinter den Buchstaben.


    In C++ macht man eigentlich

    Code
    std::stringstream buf;
    buf << "webepg: DebugLevel " << i << " set";
    
    
    std::cout << buf.str() << std::endl;


    weil xprintf ist ihbah ;)


    EDIT: Natürlich nur wenn ich buf später noch brauche sonst gleich alles nach cout jagen!

  • Danke, funktioniert alles!


    Jetzt muss ich nur noch durch diese VDR-EPG-Funktionen durchsteigen und dann solltes laufen!

    VDR: AMD A4-3400, 4096 MB RAM, Technisat SkyStar HD2, Technisat Skystar USB HD
    openSUSE 13.1, VDR 2.0.4, vdr-xineliboutput

Jetzt mitmachen!

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