Wenn ich das Programm aber mit "gcc -rdynamic -ldl -o test main.c
addid.c"
kompilieren will, bekomm ich link fehler mit "undefined reference"..
Genau dies sollte dlopen() doch deaktivieren??
Der Programmauschnitt den Du postest ist doch garantiert nicht der, der
einen Fehler erzeugt. Bitte:
- Ein komplettes, kürzestmögliches Programm das den Fehler reproduziert
erstellen und hier (komplett) posten
- Diesen Artikel und insbesondere das Beispiel lesen:
http://linux.die.net/man/3/dlopen
Und du bist dir sicher, dass du überhaupt selbst ein dlopen()
ausführen willst? Oder willst du nicht einfach dynamische
Bibliotheken linken? Am Ende geht das zwar auch über dlopen(),
aber das macht dann der run-time loader, und der füllt die
entsprechenden dynamischen Symbole auf, sodass du sie in deiner
Quelle direkt benutzen kannst. Wenn du das dlopen() selbst machen
willst, darfst du natürlich noch keine direkten Referenzen auf
die dynamischen Symbole in deinem Programm haben (ich vermute mal,
Dinge wie cvQueryFrame() sind das, worüber sich dein Linker
beschwert), denn es ist ja noch gar nicht sicher, ob das shared
object dann überhaupt gefunden wird. Den Symbolbezug kannst du
dann erst nach dem dlopen() herstellen.
Beispiele gibt's genug dafür, aber s. o., ich denke, dass das gar
nicht das ist, was du willst. Du solltest dein opencv_gui.so in
libopencv_gui.so umbenennen und dann per -lopencv_gui einfach mit
linken lassen.
bitte lerne erst, wie linken funktioniert.
vermutlich sollte es in deinem fall reichen, einfach -L und -l parameter
beim kompilieren mitzugeben, das dlopen() brauchst du nicht.
und wenn du wirklich dlopen() machst, musst du die methoden, die du
benutzen möchtest, dann erst mal mit dlsym() ein handle auf die funktion
in der lib holen.
da kann man sich sehr einfach beispiele ergooglen.
Genau darum gehts ja ^^
Es funktioniert ja wenn ich sie mit -lopencv_core etc. linke!!
Es geht mir nur darum, dass ich das Programm auf meinem Raspberrypi für
x86_64 und i686 (toolchains mit ct-ng gebaut) cross compilieren will und
er bei einfachem kopieren der libs und header zum toolchain sysroot sich
beschwert.
Matthias R. schrieb:> Es geht mir nur darum, dass ich das Programm auf meinem Raspberrypi für> x86_64 und i686 (toolchains mit ct-ng gebaut) cross compilieren will
Du compilierst auf dem Raspberry-PI Code für den PC? Warum um aller Welt
macht man denn sowas?
> und er bei einfachem kopieren der libs und header zum toolchain sysroot> sich beschwert.
Ich wüßte jetzt nicht, wie man eine Verbindung zwischen dieser Aussage
und der Notwendigkeit für dlopen() herstellen könnte.
Zu deinem Problem mit dlopen(): Wie schon erwähnt wurde: Du kannst nicht
einfach Namen aus einer Bibliothek verwenden, an die du nicht linkst.
Daran ändert auch dlopen() nichts.
Mit dlopen() öffnest du eine Bibliohthek zur Laufzeit, dann kannst du
auf die darin enthaltenen Symbole zugreifen, indem du
dlsym("symbolname") machst. dlsym() gibt dann einen Zeiger auf das
entsprechende Symbol zurück.
Wenn du also cvNamedWindow aufrufen willst, mußt du dir erst per dlsym()
einen Zeiger darauf holen und den Aufruf darüber machen.