0

私の .cpp プロジェクトのこの奇妙な動作について、私はかなり混乱しています。次のフォルダー構造があります。

include/mylib.h
myproject/src/eval.cpp
myproject/data/file.csv
myproject/Makefile

eval.cpp には、次のように mylib.h を含めます。

#include "../../include/mylib.h"

Makefile を使用してコンパイルします。

all:
     g++ -I include ../include/mylib.h src/eval.cpp -o eval.out

今、私の eval.cpp で、データディレクトリから file.csv を読んでいます。このように参照すると

../data/file.csv

それは見つかりません(常に空の行を取得します)が、これは

data/file.csv

正常に動作します。

したがって、mylib.h をインクルードするには、(src フォルダーから) 2 つ上のディレクトリに移動します。これは正しいようです。しかし、同じコードから別のファイルを参照するために、プロジェクト ディレクトリにいると仮定するのは意味がありません。なんとなく Makefile とつながっているのだろうと思いますが、よくわかりません。

なぜそうなのですか?

EDIT:私が試したいくつかのことの後、使用されるパスはバイナリの場所からデータの場所へのパスではないようですが、バイナリを実行する場所にも依存します。つまり、bin ディレクトリにバイナリがあり、次のように実行した場合:

./bin/eval.out

で動作しdata/file.csvます。

これ:

cd bin
./eval.out

で動作し../data/file.csvます。

プログラムをどこから実行するかによって、異なる出力が得られるため、非常に混乱しているように思えます。この動作の理由と、それが正常なのか、それとも私が間違いを犯しているのかを詳しく説明してもらえますか?

4

1 に答える 1

2

これは、(ここで#included説明されているように) コンパイラが、現在の作業ディレクトリがソース ファイルの場所である引用符 (括弧ではなく) を使用してファイルを検索するためです。

次に、.csv ファイルを開こうとすると、プログラムがファイルを探します。ただし、プログラムは現在の作業ディレクトリで実行されます。これは、ファイルパスとしてmyproject/指定する必要がある理由を説明しています。プログラムはフォルダーでは実行されません。バイナリが呼び出されるディレクトリで実行されます。data/file.csv../data/file.csvsrc

Makefile で、-I オプションが .cpp ファイルとは異なるヘッダー ファイルのパスを指定していることに気付いたかもしれません。

編集回答:実際には非常に単純で、完全に正常です。バイナリを呼び出すと、現在のディレクトリが現在の作業ディレクトリになります。つまり、コマンド./myproject/bin/eval.outで実行すると、現在の作業ディレクトリは . (例/home/the_user/cpp_projects)。私の投稿はそれについて少し誤解を招くものでした、私はそれを修正しました。

注:pwdコマンド プロンプトでコマンドを使用すると、このプロンプトの現在の作業ディレクトリを確認できます (pwd は「印刷作業ディレクトリ」を表します)。

于 2013-05-17T08:23:13.317 に答える