[Gelöst] Shared Library einbinden



  • Hallo Zusammen

    Ich habe bereits die FAQ, die Boardsuche und Google benutzt, doch irgendwas mache ich immer noch falsch. Man möge mir bitte den Anfängerfehler verzeihen, ich komme von C# und PHP, kenne mich also nicht sehr gut mit C++ aus.

    Ok mein Problem:
    Ich wollte ein kleines Programm als Daemon laufen lassen. Eure FAQ hatte da einen schönen Beitrag dazu. Ich entdeckte aber libdaemon0 und auf dessen Homepage ein schönes kleines Beispielprogramm.

    Ich installierte das Debianpaket libdaemon0 und konaktierte erneut das Web zum koompilieren dieses Beispiels.
    Dabei lernte ich, dass man den -l Schalter für Shared Libraries verwenden muss.

    Meine Schlussfolgerung war, dass der Befehl zum kompilieren also g++ -ldaemon daemon-demo.c -o deamon-demo heissen müsste. Irgendwie geht das jedoch nicht so recht. Hier das Ergebnis:

    daemon-demo.c:29:29: error: libdaemon/dfork.h: Datei oder Verzeichnis nicht gefunden
    daemon-demo.c:30:31: error: libdaemon/dsignal.h: Datei oder Verzeichnis nicht gefunden
    daemon-demo.c:31:28: error: libdaemon/dlog.h: Datei oder Verzeichnis nicht gefunden
    daemon-demo.c:32:28: error: libdaemon/dpid.h: Datei oder Verzeichnis nicht gefunden
    daemon-demo.c:33:29: error: libdaemon/dexec.h: Datei oder Verzeichnis nicht gefunden
    daemon-demo.c: In function ‘int main(int, char**)’:
    daemon-demo.c:39: error: ‘daemon_reset_sigs’ was not declared in this scope
    .....

    Ebenfalls versuchte ich schon folgende Befehle:

    g++ -ldaemon0 daemon-demo.c -o deamon-demo
    g++ -L/usr/lib/ -ldaemon daemon-demo.c -o deamon-demo
    g++ -L/usr/lib/ -ldaemon0 daemon-demo.c -o deamon-demo
    

    Zur Sicherheit hatte ich schon einen Symlink von libdaemon.so zu libdaemon0.so

    Kann mir jemand sagen, wo meinen Fehler liegt und wie ich dieses Programm kompilieren kann?

    Vielen Dank
    Lirum



  • Das Problem ist nicht die Library, sondern die Headerdateien. Den Pfad für Headerdateien gibt man mit -I an!



  • Hallo Rüdiger

    Vielen Dank für deine Antwort.

    Um die Headerdateien anzugeben, brauche ich doch die Sourcen, welche im Developer-Paket vorhanden sind oder gibt es auch hierfür einen Weg, dass ich die Sourcen von der Library nicht brauche?

    Folgendes Szenario:
    Ich entwickle auf dem Notebook, gebe mit -I die Sourcen dieser Library an und kann es kompilieren.

    Nun möchte ich die Software auf dem Server kompilieren und installieren. Wie bringe ich es nun fertig, dass ich da nicht wieder das dev-Paket mit den Sourcen installieren muss, sondern nur die dynamische Bibliothek?
    Klar ich könnte alles rein kompilieren, doch das ist nicht gerade die hübsche Methode.

    Kann mich jemand aufklären, was hierfür der schlauste Weg ist?

    Vielen Dank für eure Bemühungen
    Lirum



  • Du kannst ja das dev-Paket installieren, kompilieren und dann wieder das dev-Paket deinstallieren. Das wäre am einfachsten. Ansonsten könntest du entweder auf dem Notebook kompilieren und das Binary auf dem Server nutzen oder du könntest versuchen die Dateien schon durch den Preprozessor zu jagen. Das kann aber böse enden, wenn die Versionen nicht passen.

    btw. wenn du von dev-Paketen unter Debian/Ubuntu sprichst, ist der Source nicht enthalten, sondern nur alles was du zum kompilieren deiner Software brauchst.



  • Vielen Dank für die Aufklärung.

    Nun stelle ich mir aber die Frage, warum es denn diese Shared Library gibt, wenn ich zum kompilieren eh die Header-Dateien angeben muss.

    Mein Gedanke war jetzt, dass die Headerdateien ja eigentlich doof sind und ja keine Inteligenz besitzen und hier eigentlich nur zum kompilieren benötigt werden. Die eigentliche Arbeit macht dann die Library. Stimmt das oder habe ich zuviel hinein intepretiert?

    Vielen Dank
    Lirum



  • du hast teilweise schon recht. in der bibliothek steht der compilierte code. in der header datei steht aber, wie man den code ausführen muss. die ganzen deklarationen für klassen und funktionen und so weiter. bei c++ stehen dort auch die default parameter. im gegensatz zu java sind diese informationen bei c, c++ und anderen sprachen nicht in der compilierten bibliothek enthalten.
    du kannst die header datei also als eine art betriebsanleitung sehen, die dem compiler (und teilweise auch dem programmierer) sagt, wie er die bibliothek verwenden muss.



  • Vielen Dank für eure Hilfe. Für mich ist die Sache nun erledigt. Danke.


Anmelden zum Antworten