web-dev-qa-db-ja.com

1つのEclipseプロジェクト内で複数のバイナリを構築する

Eclipseに1つのプロジェクト内で一度に多くのバイナリをビルドさせるにはどうすればよいですか(Makefileを手動で作成せずに)?

複数の.cgiプログラムをWebサーバーで実行するCGIプロジェクトと、それらで使用されるいくつかのライブラリがあります。それを構築するために使用される手作りのMakefileは、ゆっくりと保守できなくなります。 Eclipseの「内部ビルド」を使用して他のすべてのプロジェクトをビルドし、ここでも使用したいと思いますが、私にとっては、すべてをリンクする代わりに、結果としてEclipseに複数の小さなプログラムをビルドさせる方法を見つけることができません。 1つのバイナリに。

25
SF.

ここで説明されているこの解決策: http://tinyguides.blogspot.ru/2013/04/multiple-binaries-in-single-Eclipse-cdt.html 。抜粋があります:

  1. 管理対象プロジェクトを作成します([ファイル]> [新しいC++プロジェクト]> [実行可能ファイル])
  2. 複数のmain()関数を含むソースコードを追加します
  3. [プロジェクト]> [プロパティ]> [C/C++一般]> [パスとシンボル]> [構成の管理]に移動します
  4. 実行可能ファイルごとにビルド構成を作成し、適切な名前を付けます(DebugやReleaseなどの既存の構成のクローンを作成できます)。
  5. プロジェクトエクスプローラーから、main()関数を含む各ソースファイルを右クリック>リソース構成>ビルドから除外し、このmain()関数で実行可能ファイルをビルドするものを除くすべてのビルド構成を除外します
  6. 他のすべてのコードは、デフォルトですべてのビルド構成に含まれています。アプリケーションによっては、これを変更する必要がある場合があります。
  7. これで、[プロジェクト]> [構成のビルド]> [アクティブに設定]、[プロジェクト]> [プロジェクトのビルド]に移動して、各メイン関数の実行可能ファイルをビルドできます。
29
hovercraft

Eclipseを本番コードのビルドシステムとして使用することは、一般的に悪い考えのように思われます。それは素晴らしいIDEであり、JavaとC++プロジェクトの両方で広く使用されていると思いますが、ビルドシステムでは、Ant、make、および他の専用ビルドユーティリティがその方法です。

これにはいくつかの理由があります。

  • 専用のビルドユーティリティは、複数の実行可能ターゲットを生成する際に求めている非常に柔軟性を提供します。

  • Antとmakeは、考えられる最も考えられる任意のビルドプロセスチェーンをサポートします(すべてではありませんが)。

  • 専用のビルドユーティリティは、EclipseのようなIDEツールよりも、ビルド記述ファイル形式の安定性と下位互換性が高い可能性があります。また、Eclipseの内部ビルド機能はに依存していると確信しています。 「.project」ファイルの説明。後者の形式は、Antまたはmakeのビルド説明の形式ほど安定していない可能性があります。

  • 汎用の基本的なビルドユーティリティは通常コマンドラインベースであるため、Pulse、CruiseControlなどの自動ビルド管理のためのより洗練された高レベルのビルドユーティリティと簡単に統合できます。

あなたの質問を動機付ける必要性は、より良いビルドツールに切り替える時が来たことをあなたに伝えています。

4
Joel Hoff

buildconfiguration sを使用して、各ビルド構成から1つのバイナリ(または私の場合は共有ライブラリ)を作成する方法があります。上記の答えを使用すると、これは、各ビルド構成から有効なメインファイルを除くすべてを手動で除外することを意味します。

上記の回答を使用して、14のビルド構成を介して14の共有ライブラリを作成する Eclipse プロジェクトでの作業を容易にしました。ただし、個々の「ビルドから除外」設定を構成するのは非常に面倒だったため、完全なメインファイルとして preprocessor-directive に依存する次のコードを使用するように切り替えました。

/*
 *main.cpp
 */
/* Within
 *  Project | Properties | C/C++-Build | Settings
 *  | GCC C++ Compiler | Preprocessor
 * set the following defined Symbol:
 *  _FILENAME=${ConfigName}
 */
#define __QUOT2__(x) #x
#define __QUOT1__(x) __QUOT2__(x)
#include __QUOT1__(_FILENAME.cpp)
#undef __QUOT1__
#undef __QUOT2__
/* The above include directive will include the file ${CfgName}.cpp,
 * wherein ${CfgName} is the name of the build configuration currently
 * active in the project.
 *
 * When right clicking in
 *  Project Tree | (Project)
 * and selecting
 *  Build Configuration | Build all
 * this file will include the corresponding .cpp file  named after the
 * build config and thereby effectively take that file as a main file.
 *
 * Remember to exclude ALL ${CfgName}.cpp files from ALL build configurations.
 */

プリプロセッサ から推測される名前の別の.cppファイルと、コンパイラオプションで設定されたシンボルが含まれていることに注意してください。シンボルは$ {CfgName}であり、Eclipseによって現在の構成名に自動的に置き換えられます。

どのファイルがどのビルド構成に含まれるかを構成する必要はありません。すべてのビルドですべての$ {CfgName} .cppファイルを除外し、すべてのビルドでmain.cppを含めるだけです。

PS:ホバークラフトからの回答は、それ自体にコードを含まないメインファイルを作成するというアイデアを私に与えました。異なる有効なメインファイル$ {CfgName} .cppからの共有コードが含まれている場合、main.cppのヘッダーファイルが表示されないため、それらのコードでの作業が実行不可能になる可能性があります。私は昨日までこれをしましたが、壊れたインデックスなどでコードを維持することは大きな苦痛でした。

PPS:このプロシージャは、含まれている.cppファイルのみが変更された場合、現在メインファイルの自動再構築を中断します。 Eclipseは$ {CfgName} .cpp(ビルドから除外されている)の変更を認識していないようです。したがって、変更するたびに手動で再構築する必要があります。これは現在私を悩ませています;)

2
Sven