インクルードパスについて

[戻る]
furu 2009/05/10(日) 02:28:35
インクルードパスについて質問があります。

#include <○○○.h>
#include <△△△.h>

上記のようにインクルードが行われている場合、環境変数INCLUDEのディレクトリを参照
しにいくものだと認識しています。
しかし、環境変数を設定し、ファイルの存在が確認できているにも関わらず、
fatal error C1083: include ファイルを開けません。'○○○.h': No such file or 
directory
のエラーが出てしまいます。
ちなみに、プロジェクトの設定において同じディレクトリを指定すると正常にビルドで
きます。

この場合、どのような問題が考えられるでしょうか?

環境は WindowsXP  VC 2003 です。

よろしくお願いします。

Ban 2009/05/10(日) 04:17:20
設定している「環境変数」と言うのは、Windowsのですか?

> 環境変数INCLUDEのディレクトリを参照
> しにいくものだと認識しています。

これがそもそも違うのでは?

「*コマンドラインからcl.exeを利用する場合には* 
 そのコンソールの環境変数を参照する」だけであって、
IDEから使う時はvcprojの設定で動作するという仕様だと思ってましたが。
(手元のXP/VC2003でも環境変数INCLUDEは効きません)

> この場合、どのような問題が考えられるでしょうか?

VCの仕様を誤認している気がします。

環境変数CLの説明ですが、以下MSDNより引用
> コンパイラ オプションは、開発環境またはコマンド ラインで設定します。 
> 
> 開発環境での指定
> 開発環境での設定方法は、コンパイラの各オプションのトピックで説明します。
> 全オプションの一覧については、「コンパイラ オプション」を参照してください。
> 
> 開発環境以外での指定
> コンパイラ (CL.exe) オプションは、次のいずれかで設定できます。 
> コマンド ライン 
> コマンド ファイル 
> 環境変数 CL 

環境変数が有効なのはあくまで「開発環境以外での指定」の時というではないかと。


# ちなみに、IDEでの設定はプロジェクトファイルに保存されますが、
# IDE用のdevenv.exeに引数指定することでコマンドラインからこれをビルドすることも
可能です。
# nmakeとは基本的に別体系のインタフェースと思った方がよいのではないかと思いま
す。

Ban 2009/05/10(日) 04:49:57
こんなのは見つけましたが…ずばりという記述ではないですかね。
http://msdn.microsoft.com/en-us/library/f2ccy3wt(VS.80).aspxhttp://
msdn.microsoft.com/ja-jp/library/f2ccy3wt(VS.80).aspx
>vcvars32.bat ファイルは、適切な環境変数を設定してコマンド
>ライン ビルドを有効にします。
>DEVENV を使用してコマンド ライン ビルドを実行する場合、
> vcvars32 の設定は、/useenv オプションを指定しない限りビルドには影響しません。

※vcvars32は、環境変数等を設定するバッチファイルです。
※DEVENVはIDEのexeです。

・「コマンドラインビルド実行時」以外の動作には直接の言及がない。
・"/useenv"はIDE機動でも有効か?>もし有効ならこれで解決でしょうか。

Ban 2009/05/10(日) 04:50:44
改行がおかしかったです。すみません。
http://msdn.microsoft.com/en-us/library/f2ccy3wt(VS.80).aspx
http://msdn.microsoft.com/ja-jp/library/f2ccy3wt(VS.80).aspx

furu 2009/05/10(日) 17:55:27
お返事ありがとうございます。

>設定している「環境変数」と言うのは、Windowsのですか?
はい。マイコンピュータから設定するほうです。

>「*コマンドラインからcl.exeを利用する場合には* 
> そのコンソールの環境変数を参照する」だけであって、
>IDEから使う時はvcprojの設定で動作するという仕様だと思ってましたが。
>(手元のXP/VC2003でも環境変数INCLUDEは効きません)
ということは、
#include <stdio.h>
などの記述のインクルードパスは環境変数以外を参照しているということでしょうか?

http://msdn.microsoft.com/ja-jp/library/73f9s62w(VS.80).aspx
一度このページを見て、INCLUDEの編集で対応可能かと思ったのですが、これはまた違っ
た意味だったのでしょうか?

よろしくお願いします。

Ban 2009/05/10(日) 21:02:32
> などの記述のインクルードパスは環境変数以外を
> 参照しているということでしょうか?

使い方によって、
・環境変数を参照するケースもあるし(開発環境以外の場合>CUI)、
・しないケースもある(開発環境での場合>GUI)、
という理解です。

> 一度このページを見て、INCLUDEの編集で対応可能かと思ったのですが、
> これはまた違った意味だったのでしょうか?

「Visual Studio 開発環境でこのコンパイラ オプションを設定するには

 プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。
 詳細については、「方法 : プロジェクト プロパティ ページを開く」を
 参照してください。 (以下略)」と書いてありますし、
開発環境(IDE)を使うときはこっちの手順で設定しろ、ってことだと思いますが。

で、それ以外でコマンドラインから直接cl.exeを機動したり、
nmake.exe等を経由してコマンドラインからcl.exeしたりすれば、
環境変数が使われるという理解です。(実際そうなります)

環境変数って一般的にはCONSOLE用のI/Fといっても過言でないと思いますし、
プログラム上の作りで言っても、WINDOWSサブシステム上のGUIから呼んだ時に
効果ないってのは、私としては普通に理解できる挙動です。
 # 普通に考えて、IDEからclを起動する際にシェルを介してるとは思えませんし、
# そもそもこのケースではclにOSの環境変数が渡ってない(渡してない)のでは。

なので、IDEからビルドするときには適用されないのではないかと思ってます。
というか個人的には「されたらイヤ」です。
プロジェクトを別のマシンにもっていったとき、IDE上から確認できないところで、
挙動が変わる可能性がある、ということになると、一般にはトラップですよね。

Ban 2009/05/10(日) 21:06:36
まとめると、
・環境変数にこだわるならvcprojファイルの代わりmakefile等でビルドする。
・IDEにこだわるなら、環境変数の代わりに「vcprojの設定(プロジェクト毎)」か、
 「tool->option]メニューからの設定(PC固有)」のいずれか/両方を使いわける。
ではないか、ということです。

furu 2009/05/10(日) 22:59:20
[[解決]]
返信ありがとうございます。

>・IDEにこだわるなら、環境変数の代わりに「vcprojの設定(プロジェクト毎)」か、
> 「tool->option]メニューからの設定(PC固有)」のいずれか/両方を使いわける。
こちらの方法で、今回の場合対応可能だと思います。

この方法は知識になく、勉強になりました。
ありがとうございました。

また何かあれば質問させていただきます。

古いスレッドには追加発言できません。