12

Windows で Qt をコンパイルしようとしましたが、#includes がインクルードされているファイルが存在しないというエラー (「そのようなファイルまたはディレクトリはありません」) で失敗するという興味深い問題に遭遇しました。ただし、ファイルは存在します。インクルードを行うファイルは、次のようなインクルードを持つ自動生成された「moc」ファイル (Qt によって作成) です。

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

そのインクルード内の文字列の長さは 127 文字です。ビルドで生成およびコンパイルされた多くの「moc」ファイルがありますが、このような非常に長いファイル (127 文字以上) のみが失敗します。

問題のファイルはたまたま UNIX システム上にあり、Samba 経由で Wi​​ndows と共有されています。シンボリック リンクを作成し、影響を受けるファイルで「qt-everywhere-opensource-src-4.8.2」を「qt-4.8.2」に置き換えることで、この問題を回避できました。結果は次のとおりです。

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

長さはわずか 102 文字で、問題なく動作します。

私は周りを検索しましたが、これへの参照を見つけることができませんでした。また、この Qt ビルド以外で問題を再現することもできませんでした (勝手に長いファイル名を作成して、それらを含めようとしただけです)。nmakeそのため、Qt が作成する makefile が実行時に何かを行っている可能性がありcl、何らかの方法で長いインクルードを拒否する可能性があります。

これに関する追加情報はありますか?

4

7 に答える 7

1

これはインクルードされたファイルを見つけるために使用されるため、OS のファイル パスの制限に関連していると思われがちです。

プリプロセッサの実装も何らかの形でそれを制限しているのかもしれませんが、それはすべてのコンパイラに固有のものです。

于 2012-08-15T12:58:20.533 に答える
0

過去の私の職場の1つで、別の同様の問題が発生しました。プロジェクトは非常に大きく、ファイルが多すぎるため、プロジェクトのビルド時にVisual Studioが生成するコンパイラコマンドが長すぎて、制限を超えてコンパイルに失敗しました。ただし、これはVisual Studio 2008で発生していたため、新しいものについてはわかりません。

私はそれが無関係であることを知っていますが、これは単なる追加情報です。それは誰かを助けるかもしれません。

于 2012-08-15T13:09:08.187 に答える
0

.NET フレームワークによって設定された制限がある可能性がありますが、これに関する正確な行はまだ見つかりません。

これに関するいくつかの興味深いリンクがあります:ソーシャル msdnおよびブログ msdn

于 2012-08-15T13:17:56.983 に答える
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 に問題のヒントが含まれてい ます。 \?\ は、相対パスをサポートしていないようです。

簡単な修正: そのような深さの相対パスを使用しないでください。

于 2012-08-15T22:02:48.420 に答える
0

「プロジェクト」タブを選択し、「シャドウビルド」のチェックを外すと、問題が解決しました。

于 2013-01-13T08:23:22.740 に答える
0

恐ろしいものを使用するのではなく、参照しているパスをコンパイラオプションに追加するだけです。

于 2012-08-16T13:39:08.100 に答える
0

最近、msys と mingw を使用して Windows で qt をビルドしているときに、まったく同じ問題に遭遇しました。ビルド システムは、次の相対パスを介してインクルードされたヘッダー ファイルを見つけることができませんでした:

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

しかし、ファイルは存在し、パスも正しいものでした。

qt ソース ツリーの外に同様のファイル構造を作成し、コマンド ラインから g++ を使用して問題を再現できました。

ファイル名の文字数を 1 つずつ減らすことで、少し手を加えました。5文字下でエラーが消えました。g++ が突然ファイルを見つけました。

include ステートメントの合計文字数が120に等しいときに機能しました。これは、ボンネットの下の限界を大まかに把握するための単なる定量的な数値です。コンパイラのバージョンによって異なる場合があります。OSがそれを決定するのに何の役割も持っていないと思います。このボトルネックは、プリプロセッサが原因のようです。

于 2013-02-18T16:04:12.863 に答える