2017-03-15 19 views
0

かなり大きなプロジェクトのために.soをコンパイルしようとしていますが、ファイルのいずれかに書かれているテンプレートやその他のクラスが完成した.soファイルにないことが問題になっています。テンプレートクラス定義を共有ライブラリにする方法を教えてください。

私はファイルを作った:私はあなたにnmでのフル出力を惜しまないだろうが、定義された非テンプレート機能のすべてがある、とテンプレートの機能のどれ

g++ -shared -fPIC -Wall filename1.cpp -o libfilename1.so 

、テンプレート化されたクラス、またはクラスがあります。クラス宣言で__attribute__ ((visibility=("default")))を使ってみましたが、何もしていないようです。

+0

おそらくテンプレートは*テンプレート*であり、具体的なクラスではないからです。例えば'std :: vector'はテンプレートです。 'std :: vector 'は具象クラスです。 –

+0

テンプレートをコンパイルするにはインスタンス化する必要があります。結論として、共有ライブラリにテンプレートを置くことはできません。 – DeiDei

+0

エクスポートされたテンプレート関数の一部をインスタンス化しますか? – em2er

答えて

0

テンプレートは、コンパイル時にのみコンパイラに存在するものです。コンパイラはテンプレートを使用して前記テンプレートのインスタンス化を作成する。それらは「本当の」クラスまたは関数です。それらはリンカーに見えるので共有ライブラリに置くことができます。

これを実現するには、ライブラリー内にテンプレートの特定のインスタンス化が存在することをライブラリーにリンクするコードをコンパイラーに通知する必要があります。これは、(ヘッダーに)明示的なインスタンス化を宣言することによって行われます。

extern template​ Class<int>; // since C++11 

第二には、あなたがソースに(明示的なテンプレートの定義を使用して、インスタンス化が存在するものと言っライブラリのコードをコンパイルするコンパイラに通知する必要がありますライブラリのコード):

template Class<int>; 
関連する問題