最近有个C++项目有这样一个的需求:一些结构体对象需要 序列化和反序列 操作。而我手头上只有 Boost库能干这事,但有个不太好的情况是其他同事的机器上并安装Boost库,因此我决定将这个对象序列化的操作封装到 一个Dll库中以提供给整个项目组使用。
问题在此时出现了,因为要序列化的结构体有若干个,而我希望提供一个统一的接口函数调用来序列化和反序列化对象,所以很自然想到了C++的模板技术,于是很快就有了下面这个头文件:
// libexport.h
#ifndef __LIBEXPORT_H__
#define __LIBEXPORT_H__
#include "structures.h"
#ifdef __DLL
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT
#endif
template<typename T>
DLLEXPORT
bool Serialize( const T& object, char** pbuffer, int& buflen );
template<typename T>
DLLEXPORT
bool Deserialize( const char* pbuffer, const int buflen, T& object );
#endif这个头文件很简单,只有两个函数模板接口, 随后在.cpp文件中实现这两个函数模板,也成功地编译链接这个DLL库工程,但是在输出目录下只看到了 .Dll文件而没有 发现.lib文件,也就是说我的这个Dll库中并未导出任何函数。如果将工程生成类型改为静态库,工程编译链接也正常完成。输出目录中也生成了.lib文件, 但是在客户端程序中使用此静态库时,会报告以下链接错误:
1>main.cpp
1>Linki

本文讲述了在C++项目中遇到的如何在DLL或静态库中导出模板函数的问题。由于模板是编译时的概念,直接导出会导致链接错误。解决方案是不在头文件中使用模板,而是在.cpp文件中为每个结构体实现具体的重载函数。这样,库的头文件保持简洁,而客户端代码可以正常链接和使用。
最低0.47元/天 解锁文章
876

被折叠的 条评论
为什么被折叠?



