从 DLL(动态库)或Lib(静态库)中导出模板函数

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


最近有个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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值