Link dynamic shared library unter Linux - Undefined reference to function
Ich weiß, es gibt viele Fragen zu shared Bibliotheken auf Linux, aber vielleicht auch, weil ich bin müde, habe eine harte Zeit versucht, zu erstellen eine einfache dynamische Bibliothek unter Linux (unter Windows wäre weniger als 10 Minuten) ich kann nicht finden, was passiert in diesem Fall.
So, ich bin versucht, erstellen Sie eine Bibliothek verknüpft werden zur build-time und verwendet, die zur Laufzeit (nicht eine statische Bibliothek, nicht eine Bibliothek eingebettet werden in die ausführbare Datei, in anderen Worten). Für jetzt ist es enthält eine einfache Funktion. Das sind meine Dateien:
1.
//gugulibrary.cpp
//This is where my function is doing its job
#include "gugulibrary.h"
namespace GuGu {
void SayHello() {
puts("Hello!");
}
}
2.
//gugulibrary.h
//This is where I declare my shared functions
#include <stdio.h>
namespace Gugu {
void SayHello();
}
3.
//guguapp.cpp
//This is the executable using the library
#include "gugulibrary.h"
int main() {
GuGu::SayHello();
return 0;
}
Dies ist, wie ich versuche, mein Projekt (und ich denke, das ist, was falsch ist):
gcc -Wall -s -O2 -fPIC -c gugulibrary.cpp -o gugulibrary.o
ld -shared -o bin/libGugu.so gugulibrary.o
gcc -Wall -s -O2 guguapp.cpp -o bin/GuGu -ldl
export LD_LIBRARY_PATH=bin
Dieser gespeichert ist als .sh-Datei, die ich auf und führen Sie in einem terminal. Den Fehler bekomme ich beim Versuch die Verknüpfung der Bibliothek ist diese:
/tmp/ccG05CQD.o: In function `main':
guguapp.cpp:(.text.startup+0x7): undefined reference to `SayHello'
collect2: ld returned 1 exit status
Und das ist, wo ich bin verloren. Ich möchte die Bibliothek, um sich im gleichen Ordner wie die ausführbare Datei für jetzt und vielleicht brauche ich einige Symbole/Definitionen-Datei oder etwas, was ich nicht weiß, wie Sie zu erstellen.
Vielen Dank für Ihre Hilfe!
- Wie es aussieht, fehlen
-lGugu
- Warum
gcc
? Warum nichtg++
? - O. K. aber ich glaube nicht, dass wird das problem lösen. Vielen Dank, trotzdem!
- Es ist auch nicht klar (zu mich), was ist der Punkt, der
extern C
wenn nicht in C Konstrukte wienamespace
verwendet wird...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie unvereinbar mit Ihren GuGu, es gibt auch Gugu läuft herum, das muss in Einklang gebracht werden, dann funktioniert es (zumindest auf meinem Rechner sind einige Gugu jetzt)
g++ -Wall -s -O2 guguapp.cpp bin/libGugu.so -o GuGu -ldl
gcc -Wall -s -O2 -fPIC -c gugulibrary.cpp -o gugulibrary.o
ld -shared -o bin/libGugu.so gugulibrary.o
gcc -Wall -s -O2 guguapp.cpp -Lbin -lGugu -o GuGu -ldl
Beachten Sie, dass der omitt die.so
Erweiterung,damit es funktioniert,export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
In der C++ - Datei
GuGu::SayHello
erklärt wird, wie ein C++ - symbol. In Ihrem Kopf, Sie wickeln es in einextern "C"
block. Dies ist eigentlich unbestimmt, Sie sind nicht erlaubt, verwenden Sie C++ - syntax (namespace
) in diesem Zusammenhang. Aber meine Vermutung ist, dass das, was der compiler macht, ist das ignorieren der namespace und die Generierung des C symbol name "SayHello". Offensichtlich hat eine solche Funktion wurde nie definiert durch Ihre Bibliothek. Nehmen Sie dieextern "C"
bits, weil Ihre API so definiert ist, können nicht verwendet werden, die von C sowieso.