我在 win7 中使用 VS2008,在 CentOS 18 中使用 g++ 4.7。仅当我使用动态共享库时,才会在 Windows 上看到此问题。当我将其转换为静态库时,程序链接正常。
我知道在共享库模板函数/类中,要么应该在头文件中定义,要么应该通过编译单元提供模板类型(参数)的模板实例化。我选择了后一个选项。我以前做过,我通过了
但是我无法弄清楚为什么在将库转换为 dll 后在 Windows 中它无法解析符号:错误 LNK2019:未解析的外部符号“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;
}