etreu Geschrieben 24. August 2005 Geschrieben 24. August 2005 Ich muss einen Vector an eine Klassenmethode übergeben. mein Code: // xfce #include <xfc/gtk/window.hh> #include <xfc/gtk/widget.hh> // C++-Libraries #include <vector> int main (int argc, char *argv[]) { std::vector<Xfc::Gtk::Widget*> liste; Xfc::Gtk::Window::list_toplevels(liste); } [/PHP] mein Fehler: [code] main.o(.text+0x61): In function `main': ../main.cpp:22: undefined reference to `Xfc::Gtk::Window::list_toplevels(std::vector<Xfc::Gtk::Widget*, std::allocator<Xfc::Gtk::Widget*> >&)' collect2: ld returned 1 exit status [/code] Im Prinzip halte ich an folgendes Beispiel von http://www.fredosaurus.com/notes-cpp/stl-containers/vector/vector-parameters.html. Einziger Unterschied, ich füge keine Werte ein. [PHP] // vector/vector-average.cpp - Averages numbers in vector // Fred Swartz - 2003-11-20 #include <vector> #include <iostream> using namespace std; float sum(const vector<float>& x); // prototype //====================================================== main int main() { vector<float> a; // Declare a vector. float temp; while (cin >> temp) { a.push_back(temp); } cout << "Average = " << sum(a)/a.size() << endl; return 0; } //======================================================= sum // sum adds the values of the vector it is passed. float sum(const vector<float>& x) { float total = 0.0; // the sum is accumulated here for (int i=0; i<x.size(); i++) { total = total + x[i]; } return total; } Und jetzt die eigentliche Frage: Wie kann ich einen leeren (aber definierten) Vektor an die Methode übergeben? Zitieren
Klotzkopp Geschrieben 24. August 2005 Geschrieben 24. August 2005 Und jetzt die eingentliche Frage: Wie kann ich einen leeren (aber definierten) Vektor an die Methode übergeben? Dein Problem ist ein ganz anderes: Der Linker findet die Funktion list_toplevels nicht. Hast du möglicherweise vergessen, eine Bibliothek dazuzulinken? Zitieren
etreu Geschrieben 24. August 2005 Autor Geschrieben 24. August 2005 list_toplevels ist eine statische Methode der Klasse Window. Diese wiederum liegt im Namensraum Xfc::Gtk. Eingebunden mittels window.hh (siehe includes). Wenn ich den die Variable als Liste schreibe, dann kommt ein Hinweis, dass die Parameter nicht passen und g++ schlägt mir die benutzte Funktion vor. (API: http://xfc.xfce.org/docs/reference/html/classXfc_1_1Gtk_1_1Window.html#z1393_0) Zitieren
Guybrush Threepwood Geschrieben 24. August 2005 Geschrieben 24. August 2005 Ja aber du brauchst zusätzlich noch eine Bibliothek. Unter Windows sind das .lib Dateien die dem Linker sagen wo er die Funktion findet. Das du so eine andee Meldung bekommst liegt daran das jetzt der Compiler meckert und dieser vor dem Linker dran ist. Zitieren
Bubble Geschrieben 24. August 2005 Geschrieben 24. August 2005 Ja aber du brauchst zusätzlich noch eine Bibliothek. Unter Windows sind das .lib Dateien die dem Linker sagen wo er die Funktion findet. Lib-Dateien sind Bibliotheken, sie enthalten Funktionen. Zitieren
Guybrush Threepwood Geschrieben 24. August 2005 Geschrieben 24. August 2005 Nee, eine Dll enthält die Funktion(en). Ich weiß nicht 100% was eine Lib Datei macht, aber sie stellt die Verbindung des Linkers zur Dll her. Zitieren
Klotzkopp Geschrieben 24. August 2005 Geschrieben 24. August 2005 Eingebunden mittels window.hh (siehe includes). Über die Headerdatei bindest du nur die Deklaration der Klasse und ihrer Methoden ein. Die Definition befindet sich in einer Bibliothek, und die musst du dazulinken. Siehe auch: http://xfc.xfce.org/docs/howto/html/getting_started.html#GS09 Zitieren
Bubble Geschrieben 24. August 2005 Geschrieben 24. August 2005 Nee, eine Dll enthält die Funktion(en). Ich weiß nicht 100% was eine Lib Datei macht, aber sie stellt die Verbindung des Linkers zur Dll her. Wenn man von Libs im Allgemeinen spricht ist diese Aussage falsch. Eine Lib enthält bereits kompilierte Funktionen (also fertigen Objekt-Code). Der "Inhalt" einer Lib wird dem fertigen Programm hinzugefügt, die Funktionen sind somit direkt im Programm enthalten. Funktionen in Libs benötigen keine DLLs. Kurz: Nach dem Linken der übrigen Programm-Module mit einer Lib steckt alles in einer EXE. Was Du meinst ist ein implizites Linken einer DLLs mit Hilfe einer Import-Library. Hierbei handelt es sich um einen Spezialfall, der vom Programmierer jedoch wie eine normale Lib-Datei gehandhabt werden kann. Der Vorteil dieser Metode ist, dass damit der Aufruf von DLL-Funktionen so einfach ist, wie üblicherweise für in Libs enthaltenen Funktionen, tatsächlich jedoch die DLL angesprochen wird. Die Funktionen einer DLL kannst Du aber auch jederzeit ohne Import-Lib aufrufen, sofern Du die Funktionen und ihre Aufrufkonventionen kennst. Einfach die DLL mit LoadLibrary laden und mit GetProcAddress Zeiger auf die Funktionen holen. Zitieren
Mephisto81 Geschrieben 26. August 2005 Geschrieben 26. August 2005 Und nicht FreeLibrary() zum Freigeben vergessen Bubble hat es absolut auf den Punkt gebracht. mein Fehler: main.o(.text+0x61): In function `main': ../main.cpp:22: undefined reference to `Xfc::Gtk::Window::list_toplevels(std::vector<Xfc::Gtk::Widget*, std::allocator<Xfc::Gtk::Widget*> >&)' collect2: ld returned 1 exit status Das du so eine andee Meldung bekommst liegt daran das jetzt der Compiler meckert und dieser vor dem Linker dran ist. Hier "meckert" nicht der Compiler sondern der Linker ("ld") weil er das Executeable wegen der nicht vorhandenen Referenz zu "list_toplevels" nicht fertigstellen kann. gruß mep Zitieren
etreu Geschrieben 28. August 2005 Autor Geschrieben 28. August 2005 Danke, das Problem lag wirklich am Linker. Allerdings benutze ich nun wirklich keine .dlls . Warum sollte ich denn auch, unter Linux? Wieso wird denn gleich angenommen, dass man C++ unter Windows programmiert? Zitieren
PuppetMaster Geschrieben 28. August 2005 Geschrieben 28. August 2005 Und nicht FreeLibrary() zum Freigeben vergessen Aber auch nur bei der Verwendung von DLLs. Libs benötigen weder LoadLibrary noch FreeLibrary, da sie sowieso in die auszuführende Datei gelinkt werden. @Enrico T. Dlls gibt es auch unter Linux., nur das sie dort eben nicht die Endund DLL tragen. Edit: Außerdem hast du nie gesagt, unter welchem OS du arbeitest, also geht man vom Standard aus, nämlich Windows. Zitieren
Bubble Geschrieben 28. August 2005 Geschrieben 28. August 2005 Allerdings benutze ich nun wirklich keine .dlls . Warum sollte ich denn auch, unter Linux? Nennt man dort Shared Object (.so). Vom Prinzip her das gleiche. Zitieren
Guybrush Threepwood Geschrieben 28. August 2005 Geschrieben 28. August 2005 Hier "meckert" nicht der Compiler sondern der Linker ("ld") weil er das Executeable wegen der nicht vorhandenen Referenz zu "list_toplevels" nicht fertigstellen kann. lies erstmal weiter Wenn ich den die Variable als Liste schreibe, dann kommt ein Hinweis, dass die Parameter nicht passen und g++ schlägt mir die benutzte Funktion vor Zitieren
Mephisto81 Geschrieben 28. August 2005 Geschrieben 28. August 2005 Aber auch nur bei der Verwendung von DLLs. Libs benötigen weder LoadLibrary noch FreeLibrary, da sie sowieso in die auszuführende Datei gelinkt werden. Stimmt. Der Hinweis darauf fehlte in meinem Posting. lies erstmal weiter Hab ich, du auch? Danke, das Problem lag wirklich am Linker. Aber der Satz mit der Liste war für mich zunächst unverständlich. Wenn du darauf geantwortet hattest ist das OK. Allerdings benutze ich nun wirklich keine .dlls . Warum sollte ich denn auch, unter Linux? Wieso wird denn gleich angenommen, dass man C++ unter Windows programmiert? OK wenn du nicht unter Windows arbeitest war das mit LoadLibrary, GetProcAddress und FreeLibrary natürlich sinnlos für dich Soweit ich weiß gibt es unter Linux die Funktionen dlopen, dlsym usw. die eine derartige Funktionalität bereitstellen. Allerdings habe ich die bisher noch nie direkt benutzen müssen gruss mep Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.