Fehler beim Linken

freak_out

freak_out

Cookie
Hey Leute,

ich lese zurzeit das Buch C++ von A bis Z. Und bin gerade dabei mich mit der Netzwerkprogrammierung auseinander zusetzen.

Also ich habe folgendes Problem. Ich möchte folgenden Code übersetzen:

Code:
// echo_client.cpp

#include "socket.h"

#include <string>

#include <iostream>

using namespace std;



int main (int argc, char *argv[]) {

   if( argc < 2 ){

      cout << "Usage: " << *argv << " ServerAdresse\n";

      return(1);

   }

   Socket sock;

   sock.create();

   // Adresse des Servers

   string argv_1 = argv[1];

   // Mit dem Server auf Port 15000 verbinden

   sock.connect( argv_1, 15000 );

   cout << "Nachricht an den Server: ";

   string s;

   getline(cin, s, '\n' );

   sock.send( s );

   sock.close();

   return 0;

}

Das Kompilen funktioniert auch ohne Probleme. Nur das Linken klappt nicht. Geany gibt folgende meldung zurück:

Code:
/tmp/cc5kZ6Fq.o: In function `main':
echo_client.cpp:(.text+0xcd): undefined reference to `Socket::Socket()'
echo_client.cpp:(.text+0xd8): undefined reference to `Socket::create()'
echo_client.cpp:(.text+0x15c): undefined reference to `Socket::connect(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)'
echo_client.cpp:(.text+0x1e9): undefined reference to `Socket::send(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const'
echo_client.cpp:(.text+0x220): undefined reference to `Socket::close() const'
echo_client.cpp:(.text+0x28a): undefined reference to `Socket::~Socket()'
echo_client.cpp:(.text+0x2a3): undefined reference to `Socket::~Socket()'
collect2: ld gab 1 als Ende-Status zurück
Kompilierung fehlgeschlagen.

Ich muss sagen das es bis jetzt immer zur so einen Fehler kam wenn ich mich mit der Netzwerkprogrammierung beschäftigt habe.

Zusatzinfo:

Kompiler: gcc-Version 4.3.2 (Ubuntu 4.3.2-1ubuntu11)
System: xubuntu 8.10

Freak_out
 
Liegt die 'socket.h' im gleichen Ordner wie die C-Datei bzw. die beim Linken verwendete Objektdatei oder ist sie wenigstens global in /usr/include oder einem anderen Include-Pfad verfügbar? Hast du beachtet, dass es evtl. im System irgendwo im Include-Pfad bereits eine socket.h gibt und dabei ggf. ein Namenskonflikt für den Linker auftritt, er also einfach die falsche socket.h verwendet?
 
Also die dateien liegen im gleich Verzeichnis. Und hab mal geguckt ob es mehrere socket.h gibt. Und es gibt einige. Daher habe ich die mal in socket123.h umbenannt und dies dan auch demensprechen im Code umgeändert. Aber trotzdem kommt die selbe Meldung.
 
Und die zur socket.h gehörige Objektdatei und/oder Bibliothek liegt auch innerhalb des LD_LIBRARY_PATH?
 
Wie bekomm ich heraus ob es innerhalb des LD_LIBRARY_PATH liegt^^
 
Entweder gibst du den Pfad beim Kompilieren mit an oder du trägst in fest in die Umgebungsvariable $LD_LIBRARY_PATH ein, die den Standard-Suchpfad beschreibt.
 
Achso ok.

Also ich habe jetzt mal die socket.h und die echo_client.cpp in einem Ordner namens a auf meinen Desktop verschoben.

Dann bin ich via Terminal in diesen Order gegangen.
Und habe folgendes eingegeben:

g++ -I/home/freakout/Desktop/a/ echo_client.cpp -o echo_client

Aber es kam wieder die selbe Meldung:
Code:
/tmp/ccjdmdhY.o: In function `main':
echo_client.cpp:(.text+0xcd): undefined reference to `Socket::Socket()'
echo_client.cpp:(.text+0xd8): undefined reference to `Socket::create()'
echo_client.cpp:(.text+0x15c): undefined reference to `Socket::connect(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)'
echo_client.cpp:(.text+0x1e9): undefined reference to `Socket::send(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const'
echo_client.cpp:(.text+0x220): undefined reference to `Socket::close() const'
echo_client.cpp:(.text+0x28a): undefined reference to `Socket::~Socket()'
echo_client.cpp:(.text+0x2a3): undefined reference to `Socket::~Socket()'
collect2: ld gab 1 als Ende-Status zurück
 
Noch mal langsam zum Mitschreiben: ;) In deiner echo_client.cpp ist die von dir verwendete Socket-Klasse nicht definiert. Ich gehe also mal davon aus, dass sie in der socket.h deklariert ist. Wenn der Compiler die zur Header gehörende Objektdatei bzw. Bibliothek finden soll, muss sie sich entweder im Source-Ordner oder innerhalb von $LD_LIBRARY_PATH befinden.
 

Ähnliche Themen

Unix Webserver mit HTML Seite erstellen

String auf Konsole ausgeben

Funktion nicht gefunden

Ausführbare C-Datei von Mac OS auf Embedded Linux ausführen

Linker meckert über nicht definierte Funktion

Zurück
Oben