Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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?

Geschrieben
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?

Geschrieben
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.

Geschrieben
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.

Geschrieben

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

Geschrieben

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?

Geschrieben
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.

Geschrieben

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

Geschrieben
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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...