2016-11-01 1 views
1

さまざまなIDLファイルから取得したDDSトピックの定義を含む静的ライブラリを構築しようとしています。私はミドルウェアとしてOpenDDSを使用しています。その後、スタティックライブラリでのテンプレートインスタンス化の防止

私はsequence<long>を含むIDLファイルを作成し、私の静的ライブラリにコンパイルし、そして私のアプリケーションに対して静的ライブラリをリンクし、私は、シンボルの複数の定義を含むリンカエラーを取得:

Error LNK2005 "public: void __cdecl TAO::unbounded_value_sequence<int>::length(unsigned int)" ([email protected][email protected]@[email protected]@[email protected]) already defined in TAO.lib(TAO.dll)  

私は信じています私の静的ライブラリにはunbounded_value_sequenceのテンプレートインスタンスが含まれており、私のアプリケーションにもインスタンス化が含まれているからです。 OpenDDSで使用されているACE TAOの中から来ているようです。

静的ライブラリでテンプレートをインスタンス化するのを避ける方法を探しています。そのため、アプリケーション内の定義を一緒にリンクして使用するだけです。私は、次を追加してみました:

extern template class TAO::unbounded_value_sequence<int>; 

これは、次のエラー生成:

Error C2961 'TAO::unbounded_value_sequence<CORBA::Long>': inconsistent explicit instantiations, a previous explicit instantiation did not specify '__declspec(dllimport)' 

を私はそのインスタンス化を見つけることを試みたが、そのない私のコードできました。それはACE自体の中にあるかもしれません。

1つのプロジェクトですべてをビルドすると問題は発生しませんが、理想的な解決策ではありません。

答えて

1

externテンプレートを使用するために必要なことは、少し異なります。実際に、externテンプレートを宣言することでインスタンス化が妨げられます。しかし、インスタレーションどこかにが必要です。それはどこかコンパイルしたいテンプレートの名前を持つcppにあります。

unbounded_value_sequence.h:

// template struct here 

extern template class TAO::unbounded_value_sequence<int>; 
extern template class TAO::unbounded_value_sequence<long>; 
// and every other instantiation you want to be in your static library 

unbounded_value_sequence.cpp:

#include "unbounded_value_sequence.h" 

// Here you compile them one time. 
template class TAO::unbounded_value_sequence<int>; 
template class TAO::unbounded_value_sequence<long>; 
// and every other instantiation you want to be in your static library 

テンプレートは、あなたのライブラリーの内側に、一度だけインスタンス化されるようになります。コンパイラは、テンプレートのインスタンシエーションを含むunbounded_value_sequenceオブジェクトファイルを生成します。彼らはそこにしか存在しません。

ライブラリのユーザーがテンプレートクラスを使用するようにするには、テンプレート実装をヘッダーに表示する必要があることを忘れないでください。

関連する問題