shared library .so
-
hi,
kann mir bitte mal einer ein ganz einfaches beispiel schreiben wie ich eine
shared library/shared object (.so) erstellen kann und dann wiederum in eine cpp einbinden kann.
Finde leider überhaupt nichts.
habe mal ne .cpp mit nurint main() { return 0; }
so kompiliert:
g++ test.cpp -shared -o test.o
Weiss aber nicht wie ich diese nun einbinden kann.
Danke
-
Um zu verstehen wie eine "shared library" funktioniert, muss man erst einmal das Konzept der FAQ verstehen. FAQ steht für "frequently asked questions" auf deutsch so viel wie "häufig gestellte Fragen". Bei der FAQ handelt es sich um eine Ansammlung von Fragen die häufig gestellt werden, damit man sich die langweilende Beantwortung der immer gleichen Fragen erspart. Wenn man nun eine Frage hat, wie zum Beispiel zu shared libraries, dann guckt man erst mal in der FAQ nach, ob die Frage nicht vielleicht schon beantwortet wurde.
Sollen wir das mal machen? Ja, okay dann geht es hier bei diesem praktischen Link weiter, der einen zu genüge begegnen dürfte, wenn man das Forum betritt FAQ.
und ach hei, is es nicht schön. Da hat ja jemand deine Frage beantwortet, so dass du sie gleich gar nicht stellen brauchst. Schon wieder viel Zeit durch die Benutzung der FAQ gesparrt. Toll so ne FAQ, nicht?
-
Habe die FAQ schon verwendet und auch den Beitrag gefunden und mehrmals gelesen.
Leider komme ich nicht weiter.
Hier steht ja eigentlich nur wie man eine datei als .so compiliert.
Ich weiss leider nicht wie ich eine library in eine .cpp includieren kann.
z.B.#include "mylib.h" //????
Danach kompilieren und die so mit angeben also wohl so:
http://www.cpp-entwicklung.de/cpplinux/cpp_main/node4.html#SECTION00438000000000000000.lieber kingruedi kannst du mir da bitte helfen;)
Danke!!!
-
Vielleicht solltest du dich erstmal mit der gewöhnlichen Aufteilung von Headern- und Codedateien befassen. Das ist denke ich eine Vorraussetzung für Libraries.
In Header-Dateien kommt die Deklaration und in die Codedateien die Implementierungen. Habe leider keinen passenden Link zur Hand.
-
Ich habe mal hier ein Beispiel gepostet wie man eine so-lib mit dlopen öffent:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-81241-and-start-is-0-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-.html
-
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.cppIch bekomme folgende Fehelrmeldung:
test.cpp: In functionint 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 functionint 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!