none
相対パスの制約 RRS feed

  • 質問


  • コンパイルで /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
    ------------------------------------------------------------------------------------------------------

    2008年12月25日 0:50

回答

  • 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

     

    2008年12月25日 14:54
    モデレータ
  •  yas7 さんからの引用

    ただ、本件のようなエラーが発生しないフォルダ構成を考えるに際して、できれば限界を明確にしておきたかった次第です。

    相対パスをどのように処理しているかは、プログラムによって差ができる可能性があります。

    APIのレベルで失敗しているのか、プログラム内の変数のサイズが原因なのか、外側からは分かりません。

    恐らくは、作った人にしか分からない話です。

     

    一般論として、MAX_PATH(260文字)が存在することから想像することはできますが、それ以上の明確な仕様は知りようがありません。

    相対パスについても限界について言及しているドキュメントはないかもしれません。(探してみていないので不明です)

     

    また、OSやVisual Studioのバージョンによって内部の挙動が違うかもしれませんし、今後のバージョンアップによって変わるかも知れません。

    明確にドキュメントに載っていない限界ギリギリを求め、またそれを前提に行動するのは、OSやVisual Studioの特定のバージョンへの依存度が高まる可能性があり、リスクが高いと思います。

     

    こういったことも考えると、限界を求めるよりは、なるべく安全な方向にシフトできるように考えていけたらと思って、先の発言をしています。

    2008年12月26日 14:36
    モデレータ

すべての返信

  • 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

     

    2008年12月25日 14:54
    モデレータ
  • Azulean さん、ご返答ありがとうございました。

    > 限界を探るのではなく、どうにかして単純化できないかを検討して下さい。

    仰るとおりだと思います。
    ただ、本件のようなエラーが発生しないフォルダ構成を考えるに際して、できれば限界を明確にしておきたかった次第です。


    > http://www.atmarkit.co.jp/fwin2k/win2ktips/991fjunction/fjunction.html

    情報をありがとうございます。参考にさせていただきます。

    2008年12月26日 4:31
  •  yas7 さんからの引用

    ただ、本件のようなエラーが発生しないフォルダ構成を考えるに際して、できれば限界を明確にしておきたかった次第です。

    相対パスをどのように処理しているかは、プログラムによって差ができる可能性があります。

    APIのレベルで失敗しているのか、プログラム内の変数のサイズが原因なのか、外側からは分かりません。

    恐らくは、作った人にしか分からない話です。

     

    一般論として、MAX_PATH(260文字)が存在することから想像することはできますが、それ以上の明確な仕様は知りようがありません。

    相対パスについても限界について言及しているドキュメントはないかもしれません。(探してみていないので不明です)

     

    また、OSやVisual Studioのバージョンによって内部の挙動が違うかもしれませんし、今後のバージョンアップによって変わるかも知れません。

    明確にドキュメントに載っていない限界ギリギリを求め、またそれを前提に行動するのは、OSやVisual Studioの特定のバージョンへの依存度が高まる可能性があり、リスクが高いと思います。

     

    こういったことも考えると、限界を求めるよりは、なるべく安全な方向にシフトできるように考えていけたらと思って、先の発言をしています。

    2008年12月26日 14:36
    モデレータ
  • Azulean さん、返答が遅れて申し訳ありません。
    詳細に補足していただき、ありがとうございました。

    2009年1月6日 3:09
  • こんにちは。中川俊輔 です。

     

    Azuleanさん、回答ありがとうございます。

     

    yas7さん、フォーラムのご利用ありがとうございます。

    有用な情報と思われたため、Azuleanさんの回答へ回答済みチェックをつけさせていただきました。

     

    今後ともフォーラムをよろしくお願いします。

    それでは!

    2009年1月15日 1:18