2016-12-29 7 views
0

私は自分のプロジェクトにCMakeビルドシステムを使用しています。gcc/g ++の代わりに

私はすべての回でプロジェクトディレクトリを知って私のプログラムが実行したい、 私は環境変数と使用を設定すると考えていた:

getenv("MYPROJDIR") 

しかし、私は全体の持続的な変数を作成する必要はありません私のプログラムを実行する前に毎回手動で一時変数を作成する必要はありません。

ビルド時にいくつかの変数を設定して、自分のソースがプロジェクトディレクトリを知っていて、実行ディレクトリの場所に関係なく入力ファイルにアクセスできるようにする方法はありますか?

私は、-Dスイッチを使用して定義するか、または使用することができます

add_definitions(-DMYPROJDIR=${PROJECT_SOURCE_DIR}) 

をしかし、私は人々が絶対に必要な場合を除きマクロを使用しないように言うのを聞いてきました。

全体的に私はこのfuntionality必要があります。

const string defaultinput = MYPROJDIR + "src/someinputdata.dat" 
ifstream myfile(defaultinput) 
+0

、値。そして、あなたが望むプロジェクトディレクトリを配置します。もう1つの可能性は、このパスをアプリケーションの引数として渡すことです。 – johngull

+0

マクロはそれほど悪い考えではありません。しかし、より柔軟性が必要な場合は、実行時に実行可能ファイルのパスを検索し、それに関連してデータファイルをロードすることができます。つまり、両方を別のディレクトリに移動して作業を続けることができます。 – Olivier

+0

本当に悪い考えです。アプリケーションが別のマシンに配備またはコピーされたときに、あなたは何をしますか?この新しいマシン上のファイルにアクセスする方法をどのように知っていますか? – SergeyA

答えて

2

をしかし、私は、人々が必要な絶対に ない限り、マクロを使用しないように言うのを聞いてきました。

それが真実であっても、私は-Dスイッチを使用することはマクロだとは言いません。

-Dスイッチを使用すると、コードにビルド時の変数を追加することができます。あなたが望むようなものです。

+1

@Vikashそれを置くには良い方法はありません。これがあなたがこの機能を必要とするいくつかのユースケースの1つであるなら、私は '-D'と一緒に行くでしょう。しかし、かなり多くの設定パラメータ(例えば20)があると、CMakeによって設定された設定ヘッダが長期的にはより良いオプションになります。 – everclear

0

定義の代替案は、使用例によって異なります。ビルド/コンパイル時の最も明白な選択肢は、実行時の決定です。

あなたのケースでは、自分のプログラムの目的地への絶対パスをプログラム自体に入れないことをお勧めします(@SergeyAコメントを参照)。

  1. これは本当にあなたのアプリケーションの一部にする必要があるデータである場合(ハードコードされた1:1リレーション)、その後、私は希望私は、次の2つのランタイムソリューションの1つをお勧めします

    おそらく、直接プログラムにsrc/someinputdata.datの内容をコンパイル

  2. いくつかのプログラム・コードを経由して、あなたの実行可能ファイルのパスを取得しますが、別のペアの名前でリソースでいくつかの設定ファイルを作ることができ、あなたのケースで