C ++のMavenのような依存関係管理?[閉まっている]


94

いくつかのサブプロジェクトに分割されているC ++プロジェクトがあるとします。サブプロジェクトはすべてDLLを生成し、開発者のさまざまなチームが各サブプロジェクトに取り組みます。メインプロジェクトをビルドしたい場合、すべてのサブプロジェクトを自分でビルドする必要がないようにする方法はありますか?

要するに、MavenがJavaに対して行うのと同様の方法で、依存関係の管理(つまり、バイナリファイルとヘッダーに対する)を行うものを探しています。

実際、私はこれにMavenを使用しようとしましたが、手動でかなり頻繁にパッケージを作成する必要があるため、これはかなり面倒です。Mavenは最新の変更を取得できません。また、Maven内からNAntを呼び出さなければならないので、コンパイルの実行は少しハックです(NAntの機能を使用してVisual Studioソリューションを直接ビルドします)。

これを行うためのヒントやアイデアはありますか?


makeを使用する際の問題は、少なくとも一度はすべてをビルドする必要があるため、依存関係のソースファイルも必要になることです。特に、依存ライブラリを再構築する場合、非常に時間がかかり、生産性に深刻な影響を与える可能性があります。それとも何か不足していますか?
weberste 2009

3
これは便利な質問のようです。多分この質問は、これらの質問をより歓迎する別のサイトに移植できますか?C ++の依存関係管理のベストプラクティスを探しています。
simgineer

これは約10年遅れているため、ここでは3つの可能性があります。誤用しmavenている、完全なポイントを逃しているmaven、または10年前にmavenC ++ を使用していなかったときは、C ++にはあまり役に立たなかった。私は2009年について話すことはできませんが、ここ数年の経験から、mavenあなたが説明している問題に対してまさにあなたが使うものです。それはあなたが望むものを正確に、そして非常に効率的かつうまく行い、あなたが主張する否定的なことをしません。2019年以降にこれを読む人はmaven、この目的での使用を強く検討する必要があります。
searchengine27

回答:


37

最初の回答:CMakeの使用をお勧めします。これは、マルチプラットフォームのメイクファイルジェネレーターです(Visual StudioまたはEclipse CDTプロジェクトも生成します)。

http://www.cmake.org/

私はそれで本当に良い経験をしました。私がそれについて気に入っている最高のことは、一般的なプロジェクト構造を作成できることでした。そのため、スクリプトを毎回変更することなく、一般的にユニットプロジェクトなどのサブプロジェクトのルックアップを含めることができます。

彼らはまた、プロジェクトに必要な、プレインストールされたビルドライブラリを見つける方法に関する多くのモジュール(Boost、QTなど)を持っています。


更新:しばらくの間、C ++のパッケージ管理を導入するための努力がありました。注目に値するいくつかのプロジェクト:

  • conan.ioは主要なビルドツールと統合します。
    • CMake
    • Visual Studio
    • Makefile
    • XCode
    • ...
  • CMakeに基づくcpm(CPMはアクティブに維持されていないことに注意してください。)
  • バカルー

コメントCPMで@RAMによって尖ったうちとしては、もはや積極的に維持されていません。


7
私は数か月前にCMakeを使用しましたが、実際に、事前にインストールされたライブラリの確認は非常にうまくいきました。ただし、他のバイナリ依存関係(つまり、私のサブプロジェクトからの依存関係)は簡単に管理できませんでした。何か不足していますか?
weberste 2009

3
@weberste、実際にはC / C ++用のMavenのようなツールはありません。開発者はapt-getのようなツールで依存関係管理を処理しようとします。
SunnyShah 2015

1
cpmは積極的に維持されておらず、2015
RAM

@RAM:指摘してくれてありがとう。投稿にあなたへの言及を追加しました。
ovanes

2
CMakeは、依存関係を見つける機能が制限されたビルドシステムです。NPM、Cargoなどの意味での依存関係マネージャーではありません
sdgfsdh

17

依存関係管理のために、このタイプのツールを実装する新しいプロジェクト(それは新興企業です)が存在します:https : //github.com/biicode(C ++依存関係マネージャー)。あなたはあなたの依存関係を追加でき、それはうまくいくはずです

現在、プロジェクトの名前はconan.ioでJFrogによって取得されました

更新:プロジェクトは死んでいます...残念ながら、スタートアップはプレミアムを支払う顧客を十分に得ることができなかったようですが、サーバーは正常に動作しているようです...

UPDATE2:代替プロジェクトがあるようです:conan.io(@mucahoに感謝)


リンクを削除できます。プロジェクトは閉じられました。現在はconan.io
carlos.baezです。

更新していただきありがとうございます!私はたいてい好奇心から探しているだけですが、ドキュメントのためにgithubをいじることはまだ可能のようです。ある時点でウェブサイトに表示されていたものほど良くないかもしれませんが、何もないよりはましだと思います。不思議に思います、conan.ioは単なるブランド変更ですか、それともまったく異なる製品ですか?
jrh

1
ブランドを変更するのではなく、すべての教訓を学んだゼロからの完全に新しいプロジェクト:社内のサーバーで完全に分散化された完全なオープンソース、すべてのビルドシステムをサポートし、バイナリを管理します。
drodri

8

以下の高レベルのビルドシステムをお勧めします。


Maven Narプラグインは良いサポートを得ています。私はそれを使用し、今のところ好きです。ただし、Mavenはモノリポジトリには適していないことを理解する必要があります。ほとんどのC ++ソリューションには、Monoレポハンドル共有ライブラリなどが必要です。
ハンス

5

依存関係の管理だけが必要な場合は、Ivyを試してみてください。Antとうまく統合されます(NAvy はIvyサイトからリンクされているこのブログに基づいて同じことをできると思います)。

Mavenの.NetバージョンであるByldanもあります。それがあなたにとってどれほどうまくいくかはわかりません。


3

MakeとGCCは、本当に優れた依存関係チェックに最適な組み合わせです。

GCCは、たとえば、特定のヘッダーに依存するすべてのソースファイルを再構築できるように、「make」依存関係ファイルを自動的に生成できます(-MDコマンドラインスイッチ)。

私のメイクファイルにカットアンドペーストするいくつかの簡単なルールがあります。

# compile c files   
%.o:    %.c
    ${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@

# compile c++ files
%.opp:  %.cpp
    ${CPP} ${CPPFLAGS} -c $< -MD -MF $(<:%.cpp=%.dep) -o $@

オブジェクトファイルがOBJ_CおよびOBJ_CPPリストで宣言されている場合:

.PHONY: cleandep
cleandep:
    rm -f $(OBJ_C:%.o=%.dep) $(OBJ_CPP:%.opp=%.dep)

-include $(OBJ_C:%.o=%.dep) $(OBJ_CPP:%.opp=%.dep)

もちろんmakeは他のプロジェクトとの依存関係などを追跡できます。たとえば、必要に応じて共有ライブラリを再構築することもできます。

たとえば、他のチームが常に最新のDLLをいくつかの共有フォルダーに置いている場合:

myapp: ${SRC_CPP} ${LIB_DIR}other_team.lib
  ...

${LIB_DIR}other_team.lib: /shared_folder/latest/other_team.lib
  cp /shared_folder/latest/other_team.lib ${LIB_DIR}other_team.lib

このソリューションに対する私の懸念に関する質問に添付されている私のコメントを参照してください
weberste '16 / 07/16

ターゲットが別のファイルに依存している場合(たとえば、実行可能ファイルが共有ライブラリに依存している場合)、その共有ライブラリに、ソースを必要とせずにライブラリのコピーが最新であることを確認するルールを設定できます。特定の場所からの最新のコピー、またはバージョン管理の更新などの実行からの最新のコピー。
ウィル

${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@これらすべてのMakeシンボルを解析するのに苦労しました。これはg++ -c main.cc -MD -MF test、コマンドラインでスタンドアロンで実行する場合のように解決され、結果が 'test'という名前のファイルに書き込まれるようです。
jrh


2

最近使っていたコナンをオススメします。プロジェクト内のすべての依存ライブラリとバイナリを維持することは非常に強力です。


1

使用済みライブラリのNuGetパッケージを作成し、依存関係管理にNuGetを使用できます。

NuGet for C ++も参照してください。


1
NuGetはVisual Studioの拡張機能です
Toughy

@Toughy、スタンドアロンの依存関係管理としても使用できます。(4M実行可能ファイル)
Yousha Aleayoub

0

SConsの上には多くのツールがあり、Autotoolsと同様の高レベルの機能を提供して、開発者の生活を容易にします(例:WAF、SNOCS)。残念ながら、SCons自体に大きな欠点があります。それは、大規模プロジェクトのコンパイル時間が長くなることです。

SNOCSを試すことをお勧めします簡単な依存関係管理を求め、単一のコマンド(コンパイラー、x86 / x64、デバッグ/リリース、静的/共有ライブラリー、テスト/)でコンパイルオプションを選択する方のために、(SCons逆)ます。ターゲットのインストールなど)。

SNOCSはまた、プロジェクト構成の出力を個別のファイルに保存することで、長いコンパイル時間の問題に取り組みます。これにより、その後のビルドで構成フェーズを完全にスキップして、直接ビルドフェーズに進むことができます(最後の機能は現在作成中です)。

大規模なソリューションではCMakeの構成が面倒になるため、ビルドシステムのメンテナンスには開発者の時間の大部分がかかります。幸いなことに、Martijnがすでに述べたように、「CMakeを使用して依存関係のあるプロジェクトを生成する」biicodeがあります。


-1

SConsを試す

SConsは、オープンソースソフトウェア構築ツール、つまり次世代のビルドツールです。SConsは、autoconf / automakeと同様の統合機能とccacheなどのコンパイラキャッシュを備えた、従来のMakeユーティリティの改良されたクロスプラットフォームの代替品と考えてください。つまり、SConsは、ソフトウェアを構築するためのより簡単で信頼性が高く、より高速な方法です。


3
SConsには、要求されたような組み込みの依存関係管理やリポジトリはありません。
Maxime Viargues、2015

-3

すべてのビルド依存システムの母であるmakeを使用することをお勧めします。


これを多用しています。GCCは、「make」が使用できる依存関係ファイルを作成できます。別の答えのために十分な、多分...
ウィル

8
makeは実際には、ビルド
オートメーション

-6

sconsを試してみてください、あなたは夢中になります。Makeは古く、維持するのが難しく、費用がかかります。


Sconsを確認しましたが、バイナリの依存関係を管理する方法が見つかりませんでした。この例はありますか?
weberste 2009

1
sconsはpythonなので、バイナリの依存関係を簡単に管理したいものは何でもコーディングできます。おそらく、バイナリ依存関係のディレクトリに「SConscript」があることも役立ちます。ここであなたの要件が厳しいのかわかりません。ペドロ。
piotr 2009

16
つまり、「何が必要かわからないが、Pythonで自分でプログラムできる」に基づいたツールを提案していることになります。では、なぜsconsが必要なのですか?
jalf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.