一般的な質問:
アンマネージ C++ の場合、内部コード共有に適しているのはどれですか?
- 実際のソース コードを共有してコードを再利用しますか? また
- ライブラリ/動的ライブラリ (+ すべてのヘッダー ファイル) を共有してコードを再利用する
コードの重複 (コピーアンドペースト症候群) やコードの肥大化を減らすための戦略は何ですか?
具体例:
私の組織でコードを共有する方法は次のとおりです。
実際のソース コードを共有することで、コードを再利用します。
プロジェクトは実際にはクロスプラットフォームである必要がありますが、VS2008 を使用して Windows で開発しています。多くのプロジェクト (.vcproj) がリポジトリにコミットされています。独自のリポジトリを持つものもあれば、リポジトリの一部になるものもあります。成果物ソリューション (.sln) (たとえば、顧客に提供するもの) ごとに、リポジトリから必要なすべてのプロジェクト (.vcproj) を svn:externals して「最終」製品を組み立てます。
これは問題なく動作しますが、最終的に各ソリューションのコード サイズが非常に大きくなる可能性があることを非常に心配しています (現在、合計コード サイズは約 75K SLOC です)。
また、注目すべきことの 1 つは、推移的な依存関係をすべて防止することです。つまり、実際のソリューション (.sln) ではない各プロジェクト (.vcproj) は、依存している場合でも、他のプロジェクトを svn:externals することはできません。これは、同じライブラリ (つまり Boost) またはプロジェクト (.vcproj) に依存する可能性のある 2 つのプロジェクト (.vcproj) を持つ可能性があるためです。したがって、両方のプロジェクトを svn:externals で 1 つのソリューションにすると、svn:externals はそれを 2 回実行します。 . そのため、各プロジェクトのすべての依存関係を慎重に文書化します。ソリューション (.sln) を作成する担当者は、すべての依存関係 (推移的を含む) がソリューションの一部として svn:externals であることを確認します。
代わりに.lib 、 .dll を使用してコードを再利用すると、明らかに各ソリューションのコード サイズが縮小され、該当する場合は上記の推移的な依存関係が排除されます (例外は、たとえば、使用するサード パーティのライブラリ/フレームワークです)。 dll (Intel TBB やデフォルトの Qt など)
補遺: (必要に応じて読んでください)
ソース コードを共有するもう 1 つの動機は、 Dr. GUIによって最もよく要約されている可能性があります。
その上、C++ で簡単にできるのは、再利用可能なバイナリ コンポーネントを作成することではありません。むしろ、C++ はソース コードの再利用を比較的容易にします。ほとんどの主要な C++ ライブラリは、コンパイルされた形式ではなく、ソース形式で出荷されることに注意してください。オブジェクトから正しく継承するために、そのソースを確認することが非常に頻繁に必要になります。また、元のライブラリを再利用するときに、元のライブラリの実装の詳細に依存するのは非常に簡単です (多くの場合必要になります)。それだけでは不十分であるかのように、元のソースを変更してライブラリのプライベート ビルドを実行したくなる (または必要になる) ことがよくあります。(MFC のプライベート ビルドはいくつありますか? 世界は決して知りません . . .)
おそらくこれが、Intel Math Kernel ライブラリのようなライブラリを見ると、"lib" フォルダに、Visual Studio バージョンごとに "vc7"、"vc8"、"vc9" がある理由です。怖いもの。
または、次の主張はどうでしょうか。
C++ は、プラグインに関しては対応が難しいことで有名です。C++ は、プラットフォーム固有およびコンパイラ固有です。C++ 標準ではアプリケーション バイナリ インターフェイス (ABI) が指定されていません。つまり、異なるコンパイラの C++ ライブラリや、同じコンパイラの異なるバージョンであっても互換性がありません。それに加えて、C++ には動的ローディングの概念がなく、各プラットフォームが独自のソリューション (他のプラットフォームと互換性がない) を提供しており、全体像がわかります。
上記の主張についてどう思いますか。Java や .NET などは、この種の問題に直面していますか? たとえば、Netbeans から JAR ファイルを生成する場合、それを IntelliJ にインポートすると、両方に互換性のある JRE/JDK があることが保証されていれば機能しますか?