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

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:

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

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…

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

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

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

#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

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

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:

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

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

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

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

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:

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