shared library .so





  • Ergänzend kann man sagen, dass wenn Du die Aufteilung erstmal beherrscht, nichts magisches mehr dabei ist eine .so zu erstellen und zu nutzen. Du bindest in Dein Programm den passenden Header ein, und gibst beim Linken den Bibliotheksnamen (ohne lib und .so, mit -l davor) mit an.

    @marcin:
    Ob ihm der "komplizierte" Weg weiterhilft wenn er noch nichtmal das Konzept von Header und Code verstanden hat? 😉



  • das ist mir auch klar. Ich kann trozdem in einer cpp die declration durchführen und muss keine .h verwenden, klar ist .h sauberer und im falle von vorcompilierten headern stdafx.h usw. von vorteil aber ich weiss einfach nicht wie ich so ne linux .so linken kann.
    Beispiel:

    //shared.cpp
    int myfirstsharedfunction()
    {
      return 0;
    }
    

    bash: g++ shared.cpp -shared -o shared.so
    [cpp]
    //test.cpp
    int main()
    {
    int test=myfirstsharedfunction();
    return 0;
    }
    [cpp]
    bash: g++ -o prog shared.so test.cpp

    Ich bekomme folgende Fehelrmeldung:
    test.cpp: In function int main()': test.cpp:3: error:myfirstsharedfunction' undeclared (first use this function)
    test.cpp:3: error: (Each undeclared identifier is reported only once for each
    function it appears in.)

    Vielen Dank!!!!!



  • shit habn tag vergessen.
    das ist mir auch klar. Ich kann trozdem in einer cpp die declration durchführen und muss keine .h verwenden, klar ist .h sauberer und im falle von vorcompilierten headern stdafx.h usw. von vorteil aber ich weiss einfach nicht wie ich so ne linux .so linken kann.
    Beispiel:

    //shared.cpp 
    int myfirstsharedfunction() 
    { 
      return 0; 
    }
    

    bash: g++ shared.cpp -shared -o shared.so

    //test.cpp 
    int main() 
    { 
    int test=myfirstsharedfunction(); 
    return 0; 
    }
    

    bash: g++ -o prog shared.so test.cpp

    Ich bekomme folgende Fehelrmeldung:
    test.cpp: In function int main()': test.cpp:3: error:myfirstsharedfunction' undeclared (first use this function)
    test.cpp:3: error: (Each undeclared identifier is reported only once for each
    function it appears in.)

    Vielen Dank!!!!!



  • Du musst die Funktion eben schon irgend wo deklarieren. Zwar nicht in einem Header (was der übliche weg ist), aber irgend wo, so dass der Compiler weiß das es so eine Funktion geben soll. (In deinem Fall dann eben in der test.cpp)

    so-Dateien linkt man übrigens anders. Aber das weißt du ja, wenn du die FAQ gelesen hast.



  • @LordJaxom
    Irgendwie habe ich die Frage so verstanden dass die lib mit einer Funktion im Programmcode geöffnet werden sollte.

    wiederum in eine cpp einbinden kann.

    Ich habe es aber wohl missverstanden.



  • @marcin richtig.
    ich möchte eine lib aus .cpp und .h
    erstellen.

    diese stupide lib die nix kann ausser ein meinetwegen printf mit konstantem wert ausgeben, in ein cpp laden includieren linken oder nennen wir es wir wollen.

    Wie auf die funktionen einer dll zugreifen.
    Danke



  • ich möchte eine lib aus .cpp und .h erstellen.
    Du möchtest also eine so lib erstellen und dann ein Testprogram schreiben das es verwendet. Ja?
    Dann leren erst mal wie man eine so-lib erstellt.
    Genau das steht schon in FAQ. Also lies bitte noch mal was in FAQ darüber steht.
    Und wenn Verständnisproblemme gibt, dann frage nochmal nach.



  • Machen wir doch ein Beispiel:

    f.h:

    #ifndef F_H
    #define F_H
    void f();
    #endif
    

    f.cpp

    #include "f.h"
    #include <iostream>
    void f()
    {
      std::cout << "Hello World!" << std::endl;
    }
    

    main.cpp:

    #include "f.h"
    
    int main(int argc, char* argv[])
    {
      f();
    }
    

    Das ganze übersetzt mit mit folgenden Kommandos:

    g++ -fPIC -c f.cpp
    g++ -shared -o libf.so f.o
    g++ -c main.cpp
    g++ -o main -L. -lf main.o
    

    Erzeugt ein Hauptprogramm mit dem Namen "main" und eine so mit dem Namen libf.so. Aufgerufen wird das ganze dann mit:

    LD_LIBRARY_PATH=. ./main
    

    Und schon haben wir einen schönen Gruß aus der Welt auf dem Bildschirm.

    Mit "ldd main" kannst Du verifizieren, daß main auch wirklich die libf.so benötigt (bzw. "LD_LIBRARY_PATH=. ldd main", dann findet der die auch).

    Tntnet



  • danke tntnet!
    Habs gestern schon hinbekommen, mich aber dann nichtmehr zu wort gemeldet, danke für die mühe (das tutorial).
    Danke!


Anmelden zum Antworten