[C++] Problem z linkowaniem biblioteki WS2_32.lib


(Wojmak) #1

Witam,

Mam jak w temacie, dość uciążliwy problem z dołączeniem biblioteki WS2_32.lib do projektu pisanego w Visual Studio 2008. Nie wiem co mogę jeszcze zrobić w kwesti linkowania tej biblioteki.

Robię to w ten sposób Project -> Properties -> Configuration Properties -> Linker -> input -> Additional Dependecies - no i tu ustawiam ścieżkę do biblioteki wyżej wymienionej znajdującej się w katalogu Microsoft SDK. Próbowałem też zrobić to w ten sposób : #pragma comment(lib,"WS2_32.lib").

Błedy jakie wyrzuca kompilator ewidentnie świadczą o braku dowiązania biblioteki :

Error 1 error LNK2028: unresolved token (0A00000B) "extern "C" int __stdcall WSACleanup(void)" (?WSACleanup@@$$J10YGHXZ) referenced in function "int __clrcall main(cli::array^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z) test.obj test

Error 2 error LNK2028: unresolved token (0A00000C) "extern "C" int __stdcall WSAStartup(unsigned short,struct WSAData *)" (?WSAStartup@@$$J18YGHGPAUWSAData@@@Z) referenced in function "int __clrcall main(cli::array^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z) test.obj test

Error 3 error LNK2019: unresolved external symbol "extern "C" int __stdcall WSACleanup(void)" (?WSACleanup@@$$J10YGHXZ) referenced in function "int __clrcall main(cli::array^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z) test.obj test

Proszę o pomoc, dawno już nie pisałem nic w C++, pamiętam, że kiedyś miałem już takie problemy.. nie pamiętam jednak jak sobie z nimi poradziłem :frowning:


(Fiołek) #2

Jeśli używasz C++/CLR to nie lepiej używać System.Net i System.Net.Sockets?


(Wojmak) #3

Nie... W tym przypadku akurat bardziej wskazane jest powstrzymanie się od .Net'a moim zdaniem (plugin do gry). Poza tym Twoja sugestia a raczej odpowiedź pytaniem na pytanie nie rozwiązuje mojego problemu - ja nie proszę o to by ktoś mi doradził w czym pisać, proszę o pomoc w rozwiązaniu problemu na jaki się natknąłem. To wciąż aktualne.. jeśli ktoś spotkał się z takim dziwactwem jak ja tu opisuje oraz rozwiązał problem to proszę o podzielenie się solucją.. Być może coś jeszcze gdzieś trzeba ustawić no nie wiem...


(somekind) #4

Chcesz pisać w .NET jednocześnie się od niego powstrzymując?

Wydaje mi się, że skoro chcesz korzystać z funkcji zwykłego C/C++, to powinieneś zrobić projekt Win32 a nie CLR, żeby się tak nie gryzło. Próbowałeś już?


(Kalin 93) #5

A może pokażesz jak inicjujesz WSA,Socket,polaczenie ?

Skad mamy wiedzieć co jest źle skoro nie dołączyłeś kodu ?


(Wojmak) #6
#pragma comment(lib,"WS2_32.lib")

#include "stdafx.h"


#include 

#include 



using namespace System;


int main(array ^args)

{

    Console::WriteLine(L"Hello World");

    WSADATA wsaData;

    WORD version;

    int error;


version = MAKEWORD( 2, 0 );


error = WSAStartup( version, &wsaData );


/* check for error */

if ( error != 0 )

{

    /* error occured */

    //return FALSE;

}


/* check for correct version */

if ( LOBYTE( wsaData.wVersion ) != 2 ||

     HIBYTE( wsaData.wVersion ) != 0 )

{

    /* incorrect WinSock version */

    WSACleanup();

    //return FALSE;

}


    return 0;

}

Oto cały kod.. Ale przecież to nie kwestia tego jak inicjuję WSA, on po prostu nie rozumie tych funkcji, nie dołącza biblioteki ... No ale rzeczywiście.. może gdzieś jest idiotyczny błąd z mojej strony.. już sam nie wiem. Aha dodam jeszcze, że ten kod jest tylko testowy.. chciałem zobaczyć czy on w nowym projekcie mi dolinkuje tą bibliotekę... w projekcie właściwym jest ten sam problem..

To ja może jeszcze podam ścieżkę do biblioteki.... może to nie ta biblioteka co trzeba w co wątpie :

"C:\Program Files (x86)\Microsoft SDKs\Windows\v5.0\Lib\IA64\WS2_32.lib" - tak to wygląda


(Fiołek) #7

Używasz .NET(C++/CLI, to jest przyczyna) to czemu nie skorzystasz z System.Net.Sockets tylko na siłę próbujesz używać WinSock?


(Wojmak) #8
pragma comment("WS2_32.lib")

#include "stdafx.h"

#include "winsock2.h"

#include "windows.h"


int _tmain(int argc, _TCHAR* argv[])

{

    WSADATA wsaData;

	WORD version;

int error;


version = MAKEWORD( 2, 0 );


error = WSAStartup( version, &wsaData );


/* check for error */

if ( error != 0 )

{

    /* error occured */

}


/* check for correct version */

if ( LOBYTE( wsaData.wVersion ) != 2 ||

     HIBYTE( wsaData.wVersion ) != 0 )

{

    /* incorrect WinSock version */

    WSACleanup();

}


	return 0;

}

Bez .Net - to samo.

-- Dodane 09.08.2009 (N) 19:46 --

Fiołek.. może i mógłbym .Net'a użyć, ale tak jak powtarzam to plugin i ja tam wole, żeby były czyste funkcje z biblioteki tejże wykorzystywane.. bez żadnych wrapperów, bo czyż nie jest tak że .Net korzysta też z winsocket ? Mnie się wydaje że to w .Necie zostało ładnie ukryte w klasach...

-- Dodane 09.08.2009 (N) 19:49 --

Być może się mylę .. być może powinienem nawet używać tego .Neta.... ALE NIE O TO TU CHODZI.. ja pytam po prostu dlaczego nie mogę dołączyć biblioteki WS2_32.lib, kiedy wydaję się że wszystko robię dobrze i to nie działa jednak... Mnie po prostu drażni takie coś.. i to musi zostać przeze mnie rozwiązane prędzej czy później... Z WASZĄ POMOCĄ RZECZ JASNA :stuck_out_tongue:


(Fiołek) #9

Nie kompiluj z opcją CLR to będzie działać!


(Wojmak) #10

Dobrze, jak tą opcję mogę wyłączyć w visual studio 2008 ... Jak na razie nie mogę tego znaleźć.


(Fiołek) #11

Właściwości projektu->General->Common Language Runtime Support->No Common Language Runtime Support lub utworzyć nowy projekt...


(Wojmak) #12

To jednak nie to... zrobiłem bez CLR jak mówiłeś.. to nic nie daje.. A już myślałem :stuck_out_tongue:


(Kalin 93) #13

Spróbuj wkleić ten kod wewnątrz int main():

WSADATA wsaData;

	WORD wVersion = MAKEWORD(2,2);

	if (!WSAStartup (wVersion,&wsaData))

	{

		cout << "WSA uruchomione pomyslnie !" << endl;

	}

	else 

	{

		cout << "Blad tworzenia WSA/nZakanczam dzialanie aplikacji!";

		WSACleanup ();

		_getch ();

		return 1;

	}

	SOCKET sClient = socket (AF_INET, SOCK_STREAM, IPPROTO_IP);

	if (sClient == SOCKET_ERROR)

	{

		cout << "Blad tworzenia socketa\nZakanczam dzialanie aplikacji!" << endl;

		closesocket (sClient);

		WSACleanup ();

		_getch ();

		return 2;

	}

To jest mój kod który działa w VC++ 2008 EE, jeśli Tobie zadziała to będziesz wiedział że gdzieś się pomyliłeś :wink:


(Wojmak) #14

Zmieniłem w właściwościach configuration type na static library z dll i się kompiluje i dołącza tamtą dll'kę tyle że u mnie output ma być .dll