2012-04-03 28 views
3

我正在VisualStudio 2005中構建Qt 4.8.1,我遇到了編譯器無法找到的問題_filenoQt,windows和_POSIX_

經過一番研究,我發現,在stdio.h它具有

#ifdef _POSIX_ 
_CRTIMP __checkReturn int __cdecl fileno(__in FILE * _File); 
#else 
_CRTIMP __checkReturn int __cdecl _fileno(__in FILE * _File); 
#endif 

我再通過Qt代碼看了一下,發現qfsfilengine_win.cpp和qfilesystemengine_win.cpp都有

#define _POSIX_ 

在我看來,這將是一個錯誤,如果我刪除這些行,它似乎建立成功。

有誰知道爲什麼這些文件會被定義爲_POSIX_

謝謝。

+1

這不是一個錯誤,posix名稱已被棄用了很長時間。這些文件不會*定義*'_POSIX_',它們只是#if而已。看起來Qt採取了一種捷徑去嘗試解決這個問題。不要編輯編譯器頭文件,你會挖掘一個非常深的洞。 – 2012-04-03 20:08:33

+1

qfsfilengine_win.cpp和qfilesystemengine_win.cpp都有#define _POSIX _。 stdio.h只是#如果是這樣,但我的問題是關於Qt cpp文件,它似乎有一個不正確的#define。 – Liron 2012-04-03 21:04:31

+1

那麼,它在技術上在Windows上是不正確的,但這些是圖書館在需要支持多種平臺和編譯器時使用的那種黑客。你在問一個XY問題。你認爲Y是問題,但這不太可能是真正的問題。我們不知道X是什麼樣子。如果你想在你的代碼中使用'fileno'而不是'_fileno',那麼你可能沒有像你應該使用QSomething類。 – 2012-04-03 21:17:28

回答

1

看來這確實是Qt中的一個bug。如果你正在爲沒有預編譯頭文件的windows構建Qt,並且遇到這個問題,只需在qfsfilengine_win.cpp和qfilesystemengine_win.cpp中刪除#define _POSIX_調用,它將成功構建。