6

C++ ゲーム プロジェクトのビルド環境をセットアップ中です。私たちの主な要件は、ゲーム コードだけでなく、その依存関係 (Ogre3D、Cegui、boost など) もビルドできることです。さらに、開発チームはさまざまなオペレーティング システムを使用するメンバーで構成されているため、Windows だけでなく Linux でもビルドできるようにしたいと考えています。

Ogre3D はビルド ツールとしてCMakeを使用します。これが、私たちのプロジェクトがこれまで CMake にもとづいていた理由です。CMake がライブラリを見つけることができるため、各チーム メンバーのシステムですべての依存関係を手動で設定すると、問題なくコンパイルできます。

問題は、依存関係を自動的に設定する実行可能な方法があるかどうかです。Java 開発者として Maven については知っていますが、c++ の世界にはどのようなツールが存在するのでしょうか?


更新:素敵な回答とリンクをありがとう。今後数日間、CMake から始めて、いくつかのツールを試して、要件を満たすものを確認します。私は確かにこれまでautotoolsを共有してきました.ドキュメンテーションが好きな限り(autobookは非常に良い読み物です)、autotoolsはWindowsでネイティブに使用されることを意図していないのではないかと心配しています.

一部の IDE で依存関係の管理を処理できるようにすることを提案した人もいます。私たちは、純粋な Vim から本格的な Eclipse CDT または Visual Studio まで、可能なすべてのテクノロジを使用してコーディングする個人で構成されています。これは、CMake がネイティブ プロジェクト ファイルを生成する機能により、ある程度の柔軟性を使用できる場所です。

4

7 に答える 7

7

最新の CMake 2.8 バージョンには、新しいExternalProjectモジュールがあります。これにより、コードをダウンロード/チェックアウトし、メイン ビルド ツリーの一部として構成およびビルドできます。また、依存関係を設定できるようにする必要があります。

私の仕事 (医用画像処理グループ) では、CMake を使用して独自のライブラリとアプリケーションをすべて構築しています。プロジェクト間のすべての依存関係を追跡するための社内ツールがあります (XML データベースで定義されています)。ほとんどのサードパーティ ライブラリ (Boost、Qt、VTK、ITK など) は、サポートするシステム (MSWin32、MSWin64、Linux32 など) ごとに 1 回ビルドされ、バージョン管理システムで zip ファイルとしてコミットされます。CMake は、開発者が作業しているシステムに応じて、正しい zip ファイルを抽出して構成します。

于 2009-12-05T14:37:26.903 に答える
4

過去 2 か月間、参加したいくつかのプロジェクトで GNU Autotools (Autoconf、Automake、Libtool) を使用してきましたが、うまく機能していると思います。正直なところ、この構文に慣れるには少し時間がかかりますが、Python スクリプト、C ライブラリ、および C++ アプリケーションの配布を必要とするプロジェクトで、この構文をうまく使用できました。ここで最初に同様の質問をしたときに私を助けてくれたリンクをいくつか紹介します。

  • GNU Autotools Pageは、システム全体に関する最高のドキュメントを提供しますが、非常に冗長です。
  • ウィキペディアには、すべてがどのように機能するかを説明するページがあります。Autoconf は、コンパイルしようとしているプラ​​ットフォームに基づいてプロジェクトを構成し、Automake はプロジェクトの Makefile をビルドし、Libtool はライブラリを処理します。
  • Makefile.am の例configure.ac の例は、開始するのに役立ちます。

その他のリンク:

  1. http://www.lrde.epita.fr/~adl/autotools.html
  2. http://www.developingprogrammers.com/index.php/2006/01/05/autotools-tutorial/
  3. http://sources.redhat.com/autobook/

私が確信していないことの 1 つは、GNU Autotools の Windows ラッパーの種類です。Cygwin 内で使用できることは知っていますが、実際に Windows プラットフォームでファイルと依存関係を配布する場合は、Windows MSI インストーラー (または Visual Studio 内でプロジェクトをパッケージ化できるもの) を使用する方がよいでしょう。

依存関係を配布したい場合は、そのライブラリを構築する特定の Makefile.am エントリを使用して、 libzipなどの別のサブディレクトリの下にそれらをセットアップできます。make installを実行すると、ライブラリは、configure スクリプトが使用する必要があると判断したlibフォルダーにインストールされます。

幸運を!

于 2009-12-01T18:21:17.097 に答える
2

問題は、依存関係を自動的に設定する実行可能な方法があるかどうかです。

セットするってどういうこと?

あなたが言ったように、依存関係がマシン上にあると、CMakeはすべてをコンパイルします。依存ソースをパッケージ化する方法を探しているだけですか? すべてのソースが揃ったら、必要なのは CMake とビルド ツール (gcc、nmake、MSVS など) だけです。

編集:サイドノート、CMakeには必要に応じてファイルをダウンロードするために使用できるfileコマンドがあります:file(DOWNLOAD url file [TIMEOUT timeout] [STATUS status] [LOG log])

編集 2: CPackは、さまざまなプラットフォームでの配布用にファイルなどをパッケージ化するために使用できる、CMake 担当者による別のツールです。Windows 用の NSIS と *nix 用の .deb または .tgz ファイルを作成できます。

于 2009-12-01T18:25:40.393 に答える
2

暗黙的な依存関係を (ヘッダー ファイルから) 自動的に追跡し、クロスプラットフォームであり、生成されたファイル (シェーダー定義など) に対処できる興味深い make 置換がいくつかあります。私がよく使っていた 2 つの例は、SConsJam / BJamです。

*make で依存関係を自動的に追跡するクロスプラットフォームの方法を知りません。あなたができる最善の方法は、ソースファイルをスキャンし (または C++ コンパイラにそれをさせる)、#includes を見つけ (条件付きコンパイルはこれを難しくします)、makefile の一部を生成するスクリプトを使用することです。ただし、何かが変更された可能性がある場合は常に、このスクリプトを呼び出す必要があります。

于 2009-12-01T18:17:38.227 に答える
2

私の職場 (電源保護用の組み込みシステムを構築しています) では、CMake を使用して問題を解決しました。私たちのセットアップでは、さまざまな場所から cmake を実行できます。

/
CMakeLists.txt "install precompiled dependencies and build project"
   project/
      CMakeLists.txt "build the project managing dependencies of subsystems"
      subsystem1/
         CMakeLists.txt "build subsystem 1 assume dependecies are already met"
      subsystem2/
         CMakeLists.txt "build subsystem 2 assume dependecies are already met"

秘訣は、各 CMakeLists.txt ファイルを個別に呼び出すことができるが、最上位のファイルがすべてを正しくビルドできることを確認することです。技術的には、サブの CMakeLists.txt ファイルは必要ありませんが、開発者を喜ばせます。プロジェクトのルートにある 1 つのモノリシック ビルド ファイルを全員で編集する必要があるとしたら、それは非常に面倒なことです。

私はシステムをセットアップしませんでした (私は手伝いましたが、それは私の子供ではありません)。著者は、boost cmake ビルド システムには非常に優れた機能がいくつか含まれており、すべてをスムーズにビルドするのに役立つと述べています。

于 2009-12-01T22:35:25.400 に答える
1

多くの *nix システムでは、ある種のパッケージ マネージャーまたはビルド システムがこれに使用されます。ソース関連で最も一般的なのは GNU Autotools です。ただし、いくつかのスクリプトと deps のオンライン保管場所を使用すると、次のように似たようなものをセットアップできます。

  • プロジェクト Makefile で、依存関係をカバーするターゲット (オプションでサブターゲットを含む) を作成します。
  • 各依存関係のターゲット内で、最初に dep ソースがプロジェクト内にあるかどうかを確認します (*nixtouchではこれに使用できますが、より完全になる可能性があります)。
  • dep が存在しない場合はcurl、 などを使用して dep をダウンロードできます。
  • make; make install; make clean;いずれの場合も、dep ターゲットが依存関係の Makefile (または他の構成スクリプト/ビルド ファイル) に対して再帰的な make 呼び出し (など) を行うようにします。dep がすでにビルドおよびインストールされている場合、make はかなり迅速に戻ります。

ただし、各 dep のインストーラーによっては (おそらくインストーラーは対話型ですか?)、これが壊れる原因となる多くのコーナー ケースがありますが、このアプローチは一般的な考え方をカバーするはずです。

于 2009-12-01T18:04:56.037 に答える
0

現在、正確なバージョン要件で C/C++ アプリのすべての依存関係を自動的にインストールできるツールに取り組んでいます。

  • コンパイラ
  • ライブラリ
  • ツール (cmake、autotools)

現在、私のアプリでは機能しています。(UnitTest++、Boost、Wt、sqlite、cmake をすべて正しい順序でインストールする)

«C++ バージョン マネージャー» (優れた Ruby バージョン マネージャーに触発された) という名前のツールは、bash でコーディングされ、github でホストされています: https://github.com/Offirmo/cvm

アドバイスや提案は大歓迎です。

于 2013-01-10T17:42:40.763 に答える