注:いくつかの関連する質問 (たとえば、この質問) は、この質問の重複としてマークされました。私はこの特定の質問を認識しており、対応する回答の解決策に従います。ただし、コンパイラが異なれば動作も異なり、その理由はわかりません。
私のライブラリはクラス テンプレートを備えており、ライブラリ内の特定のテンプレート引数のインスタンスを提供したいと考えています。これは、テンプレートがかなりのコンパイル時間を必要とするためです。クラス テンプレートは次のようになります ( stack.hpp
)
#ifndef MY_STACK
#define MY_STACK
template<class T>
class stack
{
public:
stack();
};
#endif
その実装は対応するstack.tpp
ファイルに存在します
#ifndef MY_STACK_TPP
#define MY_STACK_TPP
#include <iostream>
template<class T>
stack<T>::stack()
{
std::cout << "My stack constructor!" << std::endl;
}
#endif
特定のテンプレート引数のみをサポートしたいのでstack.cpp
、次の明示的なテンプレート インスタンスを作成します。
#include "stack.hpp"
template class stack<double>;
template class stack<char>;
#include "stack.tpp"
これは g++ および clang++ でコンパイルされますが、結果の共有ライブラリのシンボルには違いがあります。
g++ -std=c++11 -c stack.cpp -o stack.so
nm -C stack.so | grep stack
0000000000000049 t _GLOBAL__sub_I_stack.cpp
0000000000000000 W stack<char>::stack()
0000000000000000 W stack<char>::stack()
0000000000000000 n stack<char>::stack()
0000000000000000 W stack<double>::stack()
0000000000000000 W stack<double>::stack()
0000000000000000 n stack<double>::stack()
対。
clang++-7 -std=c++11 -c stack.cpp -o stack.so
nm -C stack.so | grep stack
0000000000000050 t _GLOBAL__sub_I_stack.cpp
私のアプリケーションでは、そのような明示的にインスタンス化されたクラスのコンストラクターは、clang++ では見つかりませんが、g++ では問題なく動作します。この基本的な MWE が理由を示していると思います。clang++ を使用してクラス テンプレートのコンストラクター シンボルを取得する方法を誰か教えてもらえますか?