-instances=extern を指定して複数のプログラムまたはライブラリを構築する場合は、それらを別のディレクトリに構築します。同一ディレクトリ内に構築する場合は、構築ごとにリポジトリを消去します。これにより、予期しないエラーが回避されます。詳細は、テンプレートリポジトリの共有を参照してください。
メイクファイル a.cc、b.cc、x.h、および x.cc. による次の例を考えてみましょう。この例は、-instances=extern を指定する場合のみ有効です。
........ Makefile ........ CCC = CC all: a b a: $(CCC) -I. -instances=extern -c a.cc $(CCC) -instances=extern -o a a.o b: $(CCC) -I. -instances=extern -c b.cc $(CCC) -instances=extern -o b b.o clean: /bin/rm -rf SunWS_cache *.o a b
... x.h ... template <class T> class X { public: int open(); int create(); static int variable; };
... x.cc ... template <class T> int X<T>::create() { return variable; } template <class T> int X<T>::open() { return variable; } template <class T> int X<T>::variable = 1;
... a.cc ... #include "x.h" int main() { X<int> temp1; temp1.open(); temp1.create(); }
... b.cc ... #include "x.h" int main() { X<int> temp1; temp1.create(); }
a と b の両方を構築する場合は、それらの 2 つの構築の間に make clean コマンドを追加します。次のコマンドでは、エラーが発生します。
example% make a example% make b
次のコマンドでは、エラーは発生しません。
example% make a example% make clean example% make b