3

私は静的ライブラリを構築するのは初めてで、それぞれにいくつかの固有のコードといくつかの共有コードを持つ2(+)ライブラリを作成したいと思います。私の意図は、他のプロジェクトがこれらの静的ライブラリの1つ以上をリンクすることです。

Util.h/m  <-- Shared
ImplOne.h/m  <-- Unique to 'ImplOne'
ImplTwo.h/m  <-- Unique to 'ImplTwo'

私はXCodeを使用しており、ある場合にはビルドUtil.mImplOne.mUtil.mImplTwo.m別の場合にはライブラリを生成しています。

もちろん問題は、これらのライブラリには重複するシンボルがあるため、これらのライブラリを一緒に使用できないことです。この状況に適したアーキテクチャは何ですか?

4

2 に答える 2

3

最もクリーンな代替手段は、共有用に別のライブラリを作成することだと思いますUtils.h/m。欠点は、ユーザーがおよび/またはとutils一緒にリンクする必要があることと、リンクして一緒にするために、両方のライブラリを同じバージョンの。でコンパイルする必要があることです。その見返りとして、ライブラリのソースはきれいできれいなままです。imploneimpltwoimpooneimpltwoutils

utils別の方法は、リンカーエラーを回避するために、マクロを使用しての関数名と変数名を変更することです。これの最も重要な結果はコードの重複です。両方ともimploneimpltwo同じコードを異なる名前でリンクします。もう1つは読みやすさです。関数への各参照をutilsマクロでラップする必要があるため、非常に問題が発生します。これにより、2番目のアプローチが汚くなるのでutils、別のライブラリを作成することを強くお勧めします。

于 2012-07-10T03:33:12.250 に答える
2

現在のコードベースでは、これと同様の問題があります。私の解決策は、これを書いたときに出てきた答えに似ていますが、比較/参照としてここに残しておきます。

私は一般的な静的ライブラリプロジェクトを持っています(それをlibCommonBits.aと呼びましょう)。いくつかのUIコードを含む2番目の静的ライブラリがあります(これをlibCommonUI.aと呼びましょう)。これもlibCommonBits.aに依存しています。私のメインアプリは両方のライブラリを使用する必要があります。

私の解決策は、libCommonBits.aをlibCommonUI.aに実際にリンクしないことです。ヘッダーファイルに対して正常にコンパイルされ、メインアプリが1つではなく2つの静的ライブラリに対してリンクすることを意味します。

このアプローチが、図書館を配布するより多くの人々によって採用されることを望んでいます。共通ライブラリ(JSONKitなど)にすでにリンクされている静的ライブラリを使用し、それをコードベースで個別に使用すると、イライラします。その場合、シンボルの名前変更が唯一の解決策になる可能性があります。

于 2012-07-10T03:39:11.827 に答える