3

私が行っている夏のプロジェクトのシミュレーションを実行するように設計された C++ のプログラムがあります。これはかなり計算量が多いですが、クラスター コンピューターのリソースを使用して実行する許可を得ていますが、自分のラップトップでテストして開発しています。このプログラムは出力としてテキスト ファイルを生成しますが、ここで問題が発生します。

自分のコンピューターでプログラムを実行しているか、クラスター コンピューターでプログラムを実行しているかに応じて、テキスト ファイルを異なるパスに保存する必要があります。今のところの私の解決策は$(shell hostname)、コードがコンパイルされているマシンを確認するためにメイクファイルで使用し、その出力から、メイクファイルでその操作から定義されたマクロで条件付きコンパイルを使用することでした。かつて、コンピューターとクラスターで異なるマクロを定義した 2 つの異なるバージョンのヘッダーを使用していましたが、git リポジトリを使用して変更をやり取りしていて、1 つのファイルを除外するのに非常に苦労していました。このような。

同じソースを持つ異なるコンピューターでコンパイル時にパスを設定するための最も好ましい方法は何だろうと思っていました。

4

5 に答える 5

3

異なるマシンで異なる方法でコンパイルする必要があるようには思えません。コマンドラインまたは何らかの構成ファイルから、実行時にいくつかのパスを取得する必要があるようです。

1 つの提案は、boost プログラム オプション ライブラリを使用することです。これにより、1 つの簡単なセットアップで、コマンド ラインまたは構成ファイルから同じパラメーターを読み取ることができます。これは、大きなクラスターまたはラップトップで同様のジョブを実行するときに使用したもので、うまく機能しました。

以下は、ドキュメントの簡単な例です。

// Declare the supported options.
po::options_description desc("Allowed options");
desc.add_options()
    ("help", "produce help message")
    ("compression", po::value<int>(), "set compression level")
;

po::variables_map vm;
po::store(po::parse_command_line(ac, av, desc), vm);
po::notify(vm);    

if (vm.count("help")) {
    cout << desc << "\n";
    return 1;
}

if (vm.count("compression")) {
    cout << "Compression level was set to " 
 << vm["compression"].as<int>() << ".\n";
} else {
    cout << "Compression level was not set.\n";
}
于 2012-07-11T13:57:06.727 に答える
1

私はこれについてあまり経験がありませんが、これを行う簡単な方法を 1 つ思いつくことができます。

各マシンの適切なディレクトリを指す環境変数を設定し、その環境変数をメイクファイルで使用します。

例えば、

マシン 1 の ~/.bashrc

export MY_DIRECTORY = ~/Foo

マシン 2 の ~/.bashrc

export MY_DIRECTORY = ~/Bar

Makefile は、それが実行されているマシンの環境変数を使用します。例えば。$(MY_DIRECTORY) および (~/.bashrc はリポジトリの一部ではないため、2 つのマシンに異なるコピーが存在する可能性があります)

于 2012-07-11T14:09:24.043 に答える
0

QtCore (コンパイル オプションとプラットフォームに応じて 750K から 4MB のライブラリ) への依存を許容できる場合は、QSettings を使用して、毎回ディレクトリ パスを設定することなく、ディレクトリ パスを便利に格納できます。実行時に一度コマンド ラインに渡して、プログラムに結果を設定ファイルに保存させることができます。その後、その設定は、コマンド ライン引数なしでプログラムを今後呼び出すための新しいデフォルトになります。

他の依存関係のない代替手段には、独自の構成ファイル解析ルーチンを作成するか、既存のルーチンを使用することが含まれますが、私は常に十分にテストされたオープン ソース コードに依存することを好みます。

幸運を!

于 2012-07-11T13:57:10.497 に答える
0

別のヘッダーを使用するルートを続行できます。両方を Git リポジトリにclusterHeader.hおよびとして含めlaptopHeader.h、既存の Makefile スクリプトを使用して、各システムで異なるヘッダーでビルドします。リンクの問題を軽減するために、ビルド中にスクリプト内のファイルの名前を一時的に変更またはコピーし、スクリプトのclusterHeader.hpp最後で名前を元に戻します。laptopHeader.hppheader.h

ビルド間でヘッダーの変更の一貫性を保ちたい場合は、このメソッドを別のヘッダー ファイルとして使用し、#includeそのヘッダーを OS に依存しないヘッダー内で使用します。

すなわち

source.cpp
|
-> header.hpp
    |
    -> clusterHeader.hpp OR laptopHeader.hpp

あるいは、システムがまったく同じ OS ではない限り (1 つはクラスターであるため、そうではないと想定しています)、いくつかの単純な#ifdefステートメントで非常に簡単に動作させることができます。

最後に、CMake または qmake は常にオプションです。

于 2012-07-11T14:14:48.163 に答える