Hallo,
ich arbeite mich gerade ich winsock Programmierung ein und möchte das
Socket starten. Hierfür habe ich einfach nur eine kurze Funktion, die
ich dann in der main aufrufen möchte.
Hier die entsprechende Datei:
1
/* avoid conflicts by incuding windows.h bevore winsock2.h */
2
#ifndef WIN32_LEAN_AND_MEAN
3
#define WIN32_LEAN_AND_MEAN
4
#endif
5
6
7
/*___ includes _______________________________________________________________*/
Klar kann man nun sagen, es steht doch alles da. Mir ist bewusst, dass
er beim linken das Symbol "WSAStartup" nicht finden kann. Jedoch weiß
ich einfach nicht mehr weiter. Die lib "ws2_32.lib" habe ich bereits
eingebunden (was laut google getan werden muss). Wäre dankbar für einen
Tipp.
Der Fehler deutet aber schon daraufhin, dass die .lib nicht richtig
eingebunden ist bzw. er sie nicht einbinden will.
Beim MS-Compiler reicht auch:
#pragma comment(lib, "ws2_32.lib")
direkt im Quelltext (z.B. über deinen include-Zeilen)
Herzlichen Dank. Mit der Zeile funktioniert es.
Aber um zu verstehen was ich falsch gemacht habe würde ich den Fall
gerne noch ein wenig "offen" lassen.
Im screenshot ist zu sehen, wie und wo ich die lib eingebunden habe.
Wäre das zumindest richtig gewesen?
brechbunkt schrieb:> Im screenshot ist zu sehen, wie und wo ich die lib eingebunden habe.> Wäre das zumindest richtig gewesen?
du hast nur ein Verzeichnis eingebunden, wo nach einer lib gesucht wird,
aber nicht die lib selber eingebunden.
Ich glaube das geht bei linker -> eingabe
Der Verzeichnis braucht man eigentlich nicht, bei den System libs.
Was du damit gemacht hast, ist einen Suchpfad für die Libs zu ergänzen.
Der Pfad alleine bindet noch nicht die Lib ein, sondern sagt dem
Compiler nur wenn ein "#pragma comment(lib..." dann guck auch in dem
Verzeichnis nach der lib. Bei Standard-Libs (wie eben z.B. die ws2_32)
brauchst du i.d.R. aber keinen zusätzlichen Pfad hinzufügen
EDIT: zu langsam
> wenn ein "#pragma comment(lib..." dann guck auch in dem> Verzeichnis nach der lib.
Nicht nur bei Pragma, auch bei Librarys, die "normal" unter "zusätzliche
Abhängigkeiten" ohne Pfad eingegeben werden.
Das ist übrigens bei fast allen Entwicklungsumgebungen so (damit man
eben bei zusammengehörigen Bibliotheken nicht immer wieder den Pfad
angeben muss).
Es gibt auch Leute, die - um sich Pfadangaben komplett zu sparen -
einfach alles in den Haupt-SDK-Pfad kopieren, was eine eher schlechte
Idee ist. Die einzigen Ausnahmen sind meiner Meinung nach zusätzliche
OpenGL-Header und -Libs - z.B. FreeGLUT - in den jeweiligen
Standard-GL-Include- und Lib-Unterverzeichnissen.
Leider muss ich den thread noch mal neu aufleben lassen. Die Tipps mit
dem library einbinden haben ja super funktioniert. Obwohl sie nun
bereits eingebunden ist, erscheint der gleiche Fehler schon wieder und
der Linker Vermisst das Symbol für den Befehl "inet_addr()".
1
/* avoid conflicts by including windows.h before winsock2.h */
2
#ifndef WIN32_LEAN_AND_MEAN
3
#define WIN32_LEAN_AND_MEAN
4
#endif
5
6
7
/*___ includes _______________________________________________________________*/
brechbunkt schrieb:> ...sehe ich gerade, ich würde noch eine Ws2_32.dll benötigen? Müsste ich> diese nun noch irgendwie im VisualStudio einbinden?
Nein, die befindet sich im Windows-Verzeichnis. Du linkst die
Systembibliotheken ja dynamisch, nicht statisch. D.h., in der *.lib
befinden sich (in diesem Fall) nicht die Funktionen selbst, sondern nur
Verweise auf die jeweilige Windows-DLL. Diese wird dann beim
Programmstart automatisch gefunden und geladen. BTW: #include "stdafx.h"
immer nach oben.
Gibt es eigentlich einen Grund dafür, dass du C++/CLI verwendest?
Abgesehen von der "Vermittlung" zwischen .NET-Anwendungen und nativen
Bibliotheken ist das eigentlich kaum gebräuchlich. Ich würde eher
"richtiges" C++ benutzen. Oder war das ein Versehen (falschen Projekttyp
gewählt)?
Mikrokotroller schrieb:> BTW: #include "stdafx.h" immer nach oben.
Hab's nun in die erste Zeile verschoben
Mikrokotroller schrieb:> Gibt es eigentlich einen Grund dafür, dass du C++/CLI verwendest?
Nein, War nur meine Unwissenheit. Da CLI für "Command Line" steht,
dachte ich, dass ich das wählen müsste.
Habe den Code nun in einer neuen Win32-Konsolenanwendung eingefügt. An
der Fehlermeldung wegen der Funktion "inet_addr()" hat sich natürlich
(leider) nichts geändert.
brechbunkt schrieb:> Habe den Code nun in einer neuen Win32-Konsolenanwendung eingefügt. An> der Fehlermeldung wegen der Funktion "inet_addr()" hat sich natürlich> (leider) nichts geändert.
Das hatte ich auch nicht angenommen. Es kann dich aber evtl. vor anderen
Irritationen bewahren.
Nun lösche bitte die Zeile
unsigned long inet_addr(char* cp);
Ich dreh durch... Das war es.
Eigentlich wäre diese Zeile eine Funktionsdeklaration. Kann dann
natürlich nicht gehen. Schade, dass die Fehlermeldung mich nicht auf
diese Zeile "gelenkt" hat. Da ich den Code (falsch) in mein Projekt
kopiert habe, bin ich davon ausgegangen, dass der garantiert keinen
Fehler haben wird.
Ein Riesen Danke schön für die Unterstützung.
Bin echt froh, dass es dieses Forum gibt. Ich hätte wohl eher das Visual
Studio neu installiert, als an dieser Stelle meinen Fehler zu suchen
(schließlich sind ja immer die anderen Schuld ;) )