2012-08-15 70 views
11

我一直在試圖在Windows上編譯Qt,並且遇到了一個有趣的問題,其中#includes失敗,包含的文件不存在(「沒有這樣的文件或目錄」)。但是該文件確實存在。做包括的文件是自動生成的「MOC」文件(由Qt的製造)有一個包含類似如下:Visual Studio C++包括字符串最大長度

#include "../../../../../../../../qt-everywhere-opensource-src-4.8.2/examples/tools/plugandpaintplugins/extrafilters/extrafiltersplugin.h"

字符串中包含長127個字符。在構建中生成和編譯了許多「moc」文件,但只有像這樣長(127+個字符)的文件纔會失敗。

有問題的文件碰巧坐在UNIX系統上,通過Samba共享到Windows。我能夠通過創建符號鏈接並在受影響的文件中用「qt-4.8.2」替換「qt-everywhere-opensource-src-4.8.2」來解決此問題。所產生的包括:

#include "../../../../../../../../qt-4.8.2/examples/tools/plugandpaintplugins/extrafilters/extrafiltersplugin.h"

只有102個字符,並且工作得很好。

我周圍搜索,找不到任何這方面的參考。我也不能在Qt構建之外複製問題(只是製作任意長的文件名並嘗試包含它們)。所以Qt創建的makefile可能會在運行cl時做某些事情,導致它以某種方式拒絕長期包含。

有沒有人有關於此的任何其他信息?

+0

這兩種情況下絕對路徑的長度是多少?即解決各種../../時。在大多數舊的Windows系統中,最大路徑限制爲256個字符。 – TemplateRex 2012-08-15 13:08:55

+0

本例的完整路徑分別是132和106個字符。但是操作系統在打開文件時(即在記事本或cmd shell中)沒有問題。 btw,我忘了提及我正在使用MSVS 2008. – 2012-08-15 14:43:48

+0

當我無法複製問題時,我確實使用了Samba安裝。根據我在網上找到的其他評論,我認爲它可能是目錄長度而不是文件長度,所以我做了一些非常長的假目錄,但仍然沒有問題。但後來我試圖把源文件放在長目錄中,包括../../really-long-dir/7890123...890/a.h,我得到了錯誤。這發生在約131個字符。但是我可以在路徑中使用更少的「..」來獲得更長的總路徑長度。很奇怪。我想知道這是否是預處理器中的錯誤。 – 2012-08-15 19:57:39

回答

1

由於這是用來查找包含的文件,我傾向於認爲它連接到操作系統的文件路徑限制。

也許預處理程序的實現方式也會限制它,但這對於每個編譯器都是特定的。

0

在過去的工作地點之一,我們遇到了另一個類似的問題。該項目非常龐大,文件非常多,以至於Visual Studio在構建項目時生成的編譯器命令太長,以至於超過了某些限制並且編譯失敗。然而,這發生在Visual Studio 2008上,我不知道更新的。

我知道它是無關的,但這只是附加信息。它可以幫助某人。

0

可能有一個由.NET框架設置的限制,但還沒有找到確切的線。

這裏有一些有趣的鏈接:在social msdnblog msdn

0

我在Windows上使用GCC構建項目時遇到了同樣的問題。 這個問題似乎涉及到其中的路徑是組裝的方式,

../../../../../../../../qt-everywhere-opensource-src-4.8.2/examples/tools/plugandpaintplugins/extrafilters/extrafiltersplugin.h

成爲

c:/some/working/structure/that_is/at_least/as_deep/as_the_up/levels/are/../../../../../../../../qt-everywhere-opensource-src-4.8.2/examples/tools/plugandpaintplugins/extrafilters/extrafiltersplugin.h

(例如可能不按比例,我沒算個字符。 ..)
此時,路徑處理由於時間太長而中斷。在我們的情況下,強制編譯器將使用約定版本,

c:/some/qt-everywhere-opensource-src-4.8.2/examples/tools/plugandpaintplugins/extrafilters/extrafiltersplugin.h

會讓問題消失。
MSDN在http://msdn.microsoft.com/en-us/library/windows/desktop/aa364963(v=vs.85).aspx
確實包含一些問題的提示請注意,替代的較長的支持路徑格式\?\似乎不支持相對路徑。

快速修復:不要使用這種深度的相對路徑。

0

您應該將您正在使用的路徑添加到編譯器選項,而不是使用可怕的東西。

+0

makefile和包含的問題都是由Qt構建系統自動生成的。我對他們的控制有限。幸運的是,這是一次性構建,而不是我每天都在做的事情。 – 2012-08-16 19:02:57

0

選擇'項目'選項卡並取消選中'陰影構建'解決了我的問題。

0

我在最近使用msys & mingw在windows上構建qt時遇到了完全相同的問題。構建系統無法找到通過以下相對路徑包含的頭文件:

「../../../../../../../qt-everywhere-opensource-src- 5.0.1/qtbase/src/platformsupport/fontdatabases/basic/qbasicfontdatabase_p.h「

但是文件存在,路徑也正確。

我在qt源碼樹之外創建了一個類似的文件結構,並能夠使用g ++從命令行重現問題。

我減少了一點,通過減少一次一個文件名字符的數量。五個字符下降,錯誤消失。 g ++突然發現了這個文件。

它在包含語句中的總字符等於。 這只是一個定量的數字,可以給出一個粗略的想法,可能是什麼可能是引擎蓋下的限制。對於不同版本的編譯器可能會有所不同。我不認爲操作系統在確定它有任何部分。這個瓶頸似乎更多是由於預處理器。