トップ回答者
相対パスの制約

質問
-
コンパイルで /I オプションで指定する相対パスが以下のようなとき、エラーになります。
- 作業フォルダのパスが長い
- 作業フォルダの階層が深い
相対パスの制約のように思えるのですが、具体的な制約(例えば、文字数など)をお教えいただけないでしょうか?
(絶対パスの最大文字数などについては情報としてよくあるのですが・・・)
【コンパイルエラーが発生する例】
sample.c をコンパイルするとエラーになります。
OS: WindowsXP Professional SP2
環境: Visual Studio 2008
※ /I...\ のように短い相対パスを指定できればいいのですが、当方の都合上、それができない状態です。
※ 絶対パスとしては Windows で扱える最大文字数(260?)を超えていません。
・sample.c は sample.h をインクルードしています。
-- sample.c ------------------------------------------------------------------------------------------
#include <sample.h>
void func()
{
}
------------------------------------------------------------------------------------------------------
・sample.c、sample.h は以下の場所に置きます。
C:\123456789_123456789_123456789_123456789_123456789_1234567\123456789\123456789\123456789\123456789\123456789\123456789\123456789\123456789\123456789\sample.c
C:\123456789_123456789_123456789_123456789_123456789_1234567\123456789\123456789\123456789\123456789\123456789\123456789\123456789\123456789\sample.h
・以下を実行すると、コンパイルエラーとなります。
cd C:\123456789_123456789_123456789_123456789_123456789_1234567\123456789\123456789\123456789\123456789\123456789\123456789\123456789\123456789\123456789
cl.exe -c sample.c /I..\..\..\..\..\..\..\..\..\123456789\123456789\123456789\123456789\123456789\123456789\123456789\123456789
-- 実行結果 ------------------------------------------------------------------------------------------
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
sample.c
sample.c(1) : fatal error C1083: include ファイルを開けません。'sample.h': No such file or directory
------------------------------------------------------------------------------------------------------
回答
-
cl.exeがどんな実装か分かりませんが、単純に次のように連結したとき、フォルダ名の限界である248文字を越えていそうですし、sample.hをつけると260文字を越えます。
C:\123456789_123456789_123456789_123456789_123456789_1234567\123456789\123456789\123456789\123456789\123456789\123456789\123456789\123456789\123456789\..\..\..\..\..\..\..\..\..\123456789\123456789\123456789\123456789\123456789\123456789\123456789\123456789
(257文字)
限界を探るのではなく、どうにかして単純化できないかを検討して下さい。
ジャンクションとかではどう動くんだろうかな。
http://www.atmarkit.co.jp/fwin2k/win2ktips/991fjunction/fjunction.html
-
yas7 さんからの引用
ただ、本件のようなエラーが発生しないフォルダ構成を考えるに際して、できれば限界を明確にしておきたかった次第です。相対パスをどのように処理しているかは、プログラムによって差ができる可能性があります。
APIのレベルで失敗しているのか、プログラム内の変数のサイズが原因なのか、外側からは分かりません。
恐らくは、作った人にしか分からない話です。
一般論として、MAX_PATH(260文字)が存在することから想像することはできますが、それ以上の明確な仕様は知りようがありません。
相対パスについても限界について言及しているドキュメントはないかもしれません。(探してみていないので不明です)
また、OSやVisual Studioのバージョンによって内部の挙動が違うかもしれませんし、今後のバージョンアップによって変わるかも知れません。
明確にドキュメントに載っていない限界ギリギリを求め、またそれを前提に行動するのは、OSやVisual Studioの特定のバージョンへの依存度が高まる可能性があり、リスクが高いと思います。
こういったことも考えると、限界を求めるよりは、なるべく安全な方向にシフトできるように考えていけたらと思って、先の発言をしています。
すべての返信
-
cl.exeがどんな実装か分かりませんが、単純に次のように連結したとき、フォルダ名の限界である248文字を越えていそうですし、sample.hをつけると260文字を越えます。
C:\123456789_123456789_123456789_123456789_123456789_1234567\123456789\123456789\123456789\123456789\123456789\123456789\123456789\123456789\123456789\..\..\..\..\..\..\..\..\..\123456789\123456789\123456789\123456789\123456789\123456789\123456789\123456789
(257文字)
限界を探るのではなく、どうにかして単純化できないかを検討して下さい。
ジャンクションとかではどう動くんだろうかな。
http://www.atmarkit.co.jp/fwin2k/win2ktips/991fjunction/fjunction.html
-
Azulean さん、ご返答ありがとうございました。
> 限界を探るのではなく、どうにかして単純化できないかを検討して下さい。
仰るとおりだと思います。
ただ、本件のようなエラーが発生しないフォルダ構成を考えるに際して、できれば限界を明確にしておきたかった次第です。
> http://www.atmarkit.co.jp/fwin2k/win2ktips/991fjunction/fjunction.html
情報をありがとうございます。参考にさせていただきます。 -
yas7 さんからの引用
ただ、本件のようなエラーが発生しないフォルダ構成を考えるに際して、できれば限界を明確にしておきたかった次第です。相対パスをどのように処理しているかは、プログラムによって差ができる可能性があります。
APIのレベルで失敗しているのか、プログラム内の変数のサイズが原因なのか、外側からは分かりません。
恐らくは、作った人にしか分からない話です。
一般論として、MAX_PATH(260文字)が存在することから想像することはできますが、それ以上の明確な仕様は知りようがありません。
相対パスについても限界について言及しているドキュメントはないかもしれません。(探してみていないので不明です)
また、OSやVisual Studioのバージョンによって内部の挙動が違うかもしれませんし、今後のバージョンアップによって変わるかも知れません。
明確にドキュメントに載っていない限界ギリギリを求め、またそれを前提に行動するのは、OSやVisual Studioの特定のバージョンへの依存度が高まる可能性があり、リスクが高いと思います。
こういったことも考えると、限界を求めるよりは、なるべく安全な方向にシフトできるように考えていけたらと思って、先の発言をしています。