2012-09-14 48 views
0

據我所知,編譯階段相互之間沒有任何關係。你能解釋爲什麼我有那麼奇怪的行爲:在一個A.cpp(實際上不使用socket api並且不包括winsock2.h)中包含windows.h之後,在編譯ANOTHER B.cpp時出錯winsock2.h winsock.h衝突。這個B.cpp根本沒有改變。提前致謝。C++:編譯單元獨立性和舊winsock2.h類型重定義錯誤

編輯:它實際上是一個編譯而不是鏈接錯誤。我已經把MSVC編譯器在詳細模式在這裏頭包括樹:

2>perfomancemeter.cpp 
2>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\numeric 
2>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\iterator 
2>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xutility 
2>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\climits 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\yvals.h 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\sal.h 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtassem.h 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\vadefs.h 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\use_ansi.h 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\limits.h 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h 
2>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\utility 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\iosfwd 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\cstdio 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\stdio.h 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\swprintf.inl 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\cstring 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\string.h 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\cwchar 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\wchar.h 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\wtime.inl 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xstddef 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\cstddef 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\stddef.h 
2>Note: including file:   C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdbg.h 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h 
2>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\algorithm 
2>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\memory 
2>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xmemory 
2>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\cstdlib 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\stdlib.h 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h 
2>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\exception 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\eh.h 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\malloc.h 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h 
2>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\new 
2>Note: including file: d:\repos\cbs\billing\common\perfomancemeter.h 
2>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\vector 
2>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\stdexcept 
2>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xstring 
2>Note: including file: d:\repos\cbs\billing\common\util.h 
2>Note: including file: d:\repos\cbs\billing\common\framework\include\types/types.h 
2>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\string 
2>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\istream 
2>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\ostream 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\ios 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xlocnum 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\streambuf 
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xiosbase 
2>Note: including file:   C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xlocale 
2>Note: including file:   C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\typeinfo 
2>Note: including file:   C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xdebug 
2>Note: including file:   C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xlocinfo 
2>Note: including file:   C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xlocinfo.h 
2>Note: including file:   C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\ctype.h 
2>Note: including file:    C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h 
2>Note: including file:   C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\locale.h 
2>Note: including file:    C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h 
1>c:\program files (x86)\microsoft visual studio 8\vc\platformsdk\include\winsock2.h(112) : error C2011: 'fd_set' : 'struct' type redefinition 
1>  c:\program files (x86)\microsoft visual studio 8\vc\platformsdk\include\winsock.h(54) : see declaration of 'fd_set' 

我之前遇到過這個問題,知道 的#define WIN32_LEAN_AND_MEAN 包括之前Windows頭修復它。但爲什麼在這種情況下發生?

+0

無論是'.cpp'文件之一包括其他的,你所描述不準確的情況(例如,你居然中得到錯誤鏈接,而不是編譯),或者非常奇怪的事情正在發生。更多細節將會有所幫助,例如確切的錯誤信息。 –

+1

什麼是錯誤?如果你確實分別編譯A和B,是的,他們沒有理由相互衝突。我相信你實際上在做的是編譯它們,然後將它們連接起來,最後你會看到一個鏈接器錯誤,但是因爲你沒有提到實際的錯誤,它只是一個無法測試的理論。 – Omaha

+0

沒有人這是一個彙編錯誤我在原有的問題中添加了詳細信息 –

回答

0

Windows.h包含winsock。所以,即使你不直接包含,也不會使用它,它將被包含在內。 #define WIN32_LEAN_AND_MEAN解決了這個問題,因爲這會強制只包含必要的頭文件。

可能性:

  • 你莫名其妙地結束,包括的Winsock/WINSOCK2兩次嘗試刪除Winsock直接包括和只包括WINDOWS.H

  • 您已經添加了窗口/ winsock的一個共同的頭文件:檢查包含層次結構。要進行測試,請移除常見標題,並嘗試將它們直接包含在源文件中

  • 您是否打開了預編譯頭文件?請關閉該

參考見本:http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/6177f9bc-db75-4317-9904-02ef55b527d0

+0

另一個選項 - 確保'winsock2.h'包含在'windows.h'之前,因爲'winsock2.h'禁用'winsock.h'編譯,但相反是不正確的。 –