动态链接库+函数模板



想为快速排序建一个动态链接库好在以后写算法的时候直接调用。为了便于复用,使用了函数模板,头文件如下:

#ifdef SORTDLL_EXPORTS
#define SORT_API __declspec(dllexport)
#else
#define SORT_API __declspec(dllimport)
#endif

// other functions

template
SORT_API 
void quicksort(T *a, int size);

自然地,在CPP文件里这么定义:

template
void quicksort(T*a, int size)
{
	// implements
}

生成成功,但是在另一个项目里调用quicksort函数时却显示链接错误

error LNK2019: 无法解析的外部符号 "__declspec(dllimport) void __cdecl quicksort(class Point *,int)" (__imp_??$quicksort@VPoint@@@@YAXPAVPoint@@H@Z),该符号在函数 _main 中被引用
fatal error LNK1120: 1 个无法解析的外部命令


就这么个玩意儿鼓捣了半天,读了一篇别人的博客才知道quicksort函数压根没被导出(好烦哪),而简单的解决方案就是在动态链接库的CPP文件中给想要的类型T做一个函数定义,我这儿的T是个Point类:

SORT_API
void quicksort(Point *a, int size)
{
	//  implements
}


这时,在另一个项目内成功调用了quicksort进行排序。

虽然解决了还是有点小开心,不过转念一想,我还要函数模板干啥,既然我得一个个实现。不过好在,在动态链接库内一些不导出的函数可以使用函数模板,比如快速排序用到的partition函数,所以虽然得给每一个类型T实现一次工作量也并不大,不过却觉得这样的解决不怎么优雅,希望有更好的方案。




你可能感兴趣的:(动态链接库+函数模板)