Win7 で VS2008 を使用し、CentOS 18 で g++ 4.7 を使用しています。この問題は、動的共有ライブラリを使用した場合に Windows でのみ発生します。静的ライブラリに変換すると、プログラムは正常にリンクします。
共有ライブラリ テンプレート関数/クラスでは、ヘッダー ファイルで定義するか、テンプレート タイプ (パラメーター) のテンプレート インスタンス化をコンパイル ユニットを介して提供する必要があることを理解しています。私は後者のオプションを選択しました。私は前にそれをやったことがあります、私は経験しました
テンプレートをヘッダー ファイルにしか実装できないのはなぜですか?
テンプレートを使用した C++ 共有ライブラリ: 未定義のシンボル エラー
しかし、Windows でライブラリを dll に変換するとすぐにシンボルの解決に失敗した理由がわかりません: error LNK2019: unresolved external symbol "void __cdecl HelpingRegistration(double)" (??$HelpingRegistration@N@@YAXN@Z)関数 _main で参照
Windows では、静的ライブラリで問題なく動作します。Linux では、動的ライブラリと共有ライブラリの両方が機能します。
//Static library
//Library header
#ifndef _TEMPLATED_STATIC_LIB_
#define _TEMPLATED_STATIC_LIB_
#include <iostream>
#include <string>
#include "Export.h"
template<typename T>
class EXPORT TemplatedStaticLib
{
public:
TemplatedStaticLib(){};
~TemplatedStaticLib(){};
void print(T t);
};
template<typename T>
EXPORT void HelpingRegistration(T);
#endif
// ライブラリ .cpp
#include "TemplatedStaticLib.h"
#include <typeinfo>
template<typename T>
void TemplatedStaticLib<T>::print(T t)
{
std::cout << "Templated Print: "<< t<< " type:: " << typeid(t).name() << std::endl;
}
//Class Template explicit instantiation
template class TemplatedStaticLib<double>;
template class TemplatedStaticLib<std::string>;
template<typename T>
void HelpingRegistration(T t)
{
std::cout << "Function Templated Print: " << t << " type: " << typeid(t).name() << std::endl;
//return t;
}
//function template explicit instantiation
template void HelpingRegistration<>( double );
template void HelpingRegistration<>( std::string );
//Windows シンボル エクスポータ
//.h
#ifndef STATIC_LIB_EXPORT
#define STATIC_LIB_EXPORT
#if !defined WIN32
#define EXPORT
#elif defined LIB_EXPORTS
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif
//STATIC_LIB_EXPORT
#endif
// ライブラリ ユーザー .cpp
#include <TemplatedStaticLib/TemplatedStaticLib.h>
#include<string>
int main(int argc, char* argv[])
{
double aDouble = 3.9;
TemplatedStaticLib<double> double_test;
double_test.print(aDouble);
std::string aString = "James";
TemplatedStaticLib<std::string> string_test;
string_test.print(aString);
HelpingRegistration(aDouble);
HelpingRegistration(aString);
return 0;
}