2016-09-09 14 views
0

現在実行中のファイル名をC++で取得しようとしています。私はargv [0]とboost current_path()メソッドの両方を使う簡単なコードを書いた。ファイルは実行可能ファイルmainWindowにコンパイルされます。興味深いことに、それぞれの方法の出力が異なります。実行ファイル名を取得する:argv [0] vs boost :: filesystem :: current_path()

のargv [0]出力である:

../VENTOS/src/loggingWindow/mainWindow

CURRENT_PATH()が出力される。

/ホーム/マニ/デスクトップ/ VENTOS_Redpine

私のプログラムは実行されていません(mainWindo w)端末から直接。別のアプリケーションが私のプログラムを呼び出しています。なぜ出力が異なるのでしょうか。私はこれについて正しいですか?

私の2番目の質問は、argv [0]オプションを使用せず、boostファイルシステムのメソッドだけに依存すると、どうすればargv [0]と同じ結果を得ることができますか?

答えて

3

argv[0]には、プログラムの実行に使用されるコマンドのみが含まれています。これにはパスが含まれることがあります。それは相対パスを含むかもしれません。それは全くパスを含んでいないかもしれません。シンボリックリンクなどの実行可能な名前を含んでいない可能性もあります。ホスティングシステムが何も提供しない場合、空であってもかまいません。それは信頼できないので、他の方法を評価するための基礎としてこれを使用したくない。

boost::filesystem::current_pathは、現在の作業ディレクトリのみを返すため、失敗します。これは、プログラムが実行されたディレクトリと、プログラムによって作業ディレクトリが変更されているかどうかに依存するため、実行可能ファイルの場所であってもなくてもかまいません。 Boostからプロセス名とパスを取得する確実な方法があるかどうかは分かりません。数年前にはなかったが、時間は行進する方法を持っていた、あなたは知っている?

は、実行可能ファイルとパスを(Finding current executable's path without /proc/self/exeが有望に見えるが、古くなっている。その時行進ものを再度。)を取得する方法をカバーする質問のスルーがありますが、すべてはあなたのためにいくつかのifdefまたはリンカー魔術を行う必要があり、プラットフォーム固有のものですこの作品を作る。

関連する問題