さまざまな IDL ファイルから取得した DDS トピックの定義を含む静的ライブラリを構築しようとしています。ミドルウェアとして OpenDDS を使用しています。
を含む IDL ファイルを作成し、sequence<long>
それをスタティック ライブラリにコンパイルしてから、そのスタティック ライブラリをアプリケーションにリンクすると、複数のシンボル定義を含むリンカ エラーが発生します。
Error LNK2005 "public: void __cdecl TAO::unbounded_value_sequence<int>::length(unsigned int)" (?length@?$unbounded_value_sequence@H@TAO@@QEAAXI@Z) 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 つのプロジェクトですべてをビルドしても問題は発生しませんが、それは理想的な解決策ではありません。