Autor Wątek: Visual Studio i dołączenie winsock2.h  (Przeczytany 2293 razy)

Offline .Dexter.

  • Użytkownik

# Listopad 15, 2007, 20:27:47
Mam problem z Visual Studio...
Otóż wszystko działało ok, a dziś nagle przestało.
Jak zawsze odpalałem Visuala, stworzyłem projekt, w Properties->Linker->Command Line dodałem wsock32.lib, a do pliku źródłowego #include <winsock2.h>
Przy próbie kompilacji nawet pustego programu wysypuje mi mnóstwo błędów typu:
Cytuj
D:\Microsoft Visual Studio 8\VC\include\winsock2.h(53) : error C2011: 'fd_set' : 'struct' type redefinition
        D:\Microsoft Visual Studio 8\VC\PlatformSDK\include\winsock.h(54) : see declaration of 'fd_set'
D:\Microsoft Visual Studio 8\VC\include\winsock2.h(101) : error C2011: 'timeval' : 'struct' type redefinition
        D:\Microsoft Visual Studio 8\VC\PlatformSDK\include\winsock.h(97) : see declaration of 'timeval'
Jak tylko usunę #include <winsock2.h> wszystko działa jak należy...
Próbowałem definiować #define WIN32_LEAN_AND_MEAN przed #include <windows.h>,
próbowałem objąć #include <winsock2.h> w extern "C" { ... },
zamieniałem miejscami #include'y
Nic mi to nie dało...

Jakieś sugestie, rady w tym temacie?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

RageX

  • Gość
# Listopad 15, 2007, 20:40:29
A czytales wogole te bledy? :) Z nich jasno wynika, ze w pliku naglowkowym winsock2.h conajmniej dwa razy dolaczasz winsock.h. Przejrzyj moze ten pierwszy plik.

Offline .Dexter.

  • Użytkownik

# Listopad 15, 2007, 20:52:09
Właśnie o to chodzi, że dołączam go RAZ. Tworzę nowy projekt i dołączam raz...

Offline Xion

  • Redaktor
    • xion.log

# Listopad 15, 2007, 22:02:38
Zapewne kłóci się to jakoś z windows.h. Jeżeli już musisz go dołączać, to rób to przed winsock2.h.

Offline .Dexter.

  • Użytkownik

# Listopad 15, 2007, 22:30:57
Nom, pisałem, że próbowałem zmieniać kolejność #include'ów. Z resztą bez windows.h też jest to samo...
Moje Visual Studio zdziwaczało!

Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Listopad 15, 2007, 22:39:31
Wygląda na to, że include'ujesz nie ten winsock2.h co trzeba. Powinien to być ten z katalogu Platform SDK, a w komunikatach widzę, że masz jeszcze drugi w VC\include. Być może ten drugi się jakoś różni - na przykład nie ma w nim tego zabepieczenia:

Kod: (cpp) [Zaznacz]
#ifndef _WINSOCK2API_
#define _WINSOCK2API_
#define _WINSOCKAPI_   /* Prevent inclusion of winsock.h in windows.h */

Offline .Dexter.

  • Użytkownik

# Listopad 16, 2007, 16:21:27
Nie działa :/
Przed chwilą próbowałem skopiować sam nagłówek winsock'a do katalogu projektu i dać #include "winsock2.h", ale dzieje się dokładnie to samo...

RageX

  • Gość
# Listopad 16, 2007, 16:40:01
Miałem taki przypadek. Przed każdym #include <windows.h> (lub po prostu na początku każdego pliku cpp) daj #define _WINSOCKAPI_.

Offline .Dexter.

  • Użytkownik

# Listopad 16, 2007, 17:48:43
Dzięki bies!

To działa :)
k++

Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Listopad 16, 2007, 18:07:03
Dzięki bies!

A mi to nikt nie podziękuje? Pierwszy pokazałem linijkę kodu, która ma tutaj kluczowe znaczenie. Cholerny świat :P.

RageX

  • Gość
# Listopad 16, 2007, 18:53:18
Preprocessor w C++ to niestety podstawa którą w przypadku #include-ów trzeba znać.
sam ładuje wszystko do jednego nagłówka Globals i mam na nie(include-y), wyłożone. Wszystko w jednym miejscu, ehh.
W każdym pliku umieszczam
#ifndef INC_GLOBALS_H
#define INC_GLOBALS_H
#include "Globals.h"
#endif
I już nawet nie pamiętam po co ten system sobie montowałem. Chyba żeby znosić podwójną referencje(nie include-ować tych samych plików 2 razy) właśnie.

Kurka przecież na gamedev.net jest cały artykuł o tym... mielone to było tutaj zapewne milion razy (toż to podstawa, nieprawdaż?). Ehh. :)



Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Listopad 16, 2007, 19:02:16
sam ładuje wszystko do jednego nagłówka Globals i mam na nie(include-y), wyłożone. Wszystko w jednym miejscu, ehh.
W każdym pliku umieszczam
#ifndef INC_GLOBALS_H
#define INC_GLOBALS_H
#include "Globals.h"
#endif
I już nawet nie pamiętam po co ten system sobie montowałem. Chyba żeby znosić podwójną referencje(nie include-ować tych samych plików 2 razy) właśnie.

Cholernie dobre podejście. Najmniejsza zmiana w jakimkolwiek nagłówku == rekompilacja całego projektu :).

Offline .Dexter.

  • Użytkownik

# Listopad 16, 2007, 20:04:13
No dobrze już dobrze, dziękuję też Złośliwcowi za ten pierwszy kawałek kodu i wszystkim innym, którzy starali się pomóc! :P

 ;)

RageX

  • Gość
# Listopad 16, 2007, 21:44:46
sam ładuje wszystko do jednego nagłówka Globals i mam na nie(include-y), wyłożone. Wszystko w jednym miejscu, ehh.
W każdym pliku umieszczam
#ifndef INC_GLOBALS_H
#define INC_GLOBALS_H
#include "Globals.h"
#endif
I już nawet nie pamiętam po co ten system sobie montowałem. Chyba żeby znosić podwójną referencje(nie include-ować tych samych plików 2 razy) właśnie.

Cholernie dobre podejście. Najmniejsza zmiana w jakimkolwiek nagłówku == rekompilacja całego projektu :).
Mam wyłożone póki mój projekt nie urośnie i nie rozbije go na .dll-e? :)
sick! C++
« Ostatnia zmiana: Listopad 16, 2007, 21:52:48 wysłana przez RageX »

Offline puch

  • Użytkownik

# Listopad 16, 2007, 21:47:58
Cytuj
A mi to nikt nie podziękuje?

Dziękuje