一般而言,动态链接库中定义有两种函数:导出函数(export function)和内部函数(internal function)。
导出函数可以被其它模块调用,内部函数在定义它们的DLL程序内部使用。
在要输出的函数、类、数据的声明前加上__declspec(dllexport)的修饰符,表示输出。
有导出就有导入__declspec(dllimport),声明某个类、函数是从dll中导入的。
实际情况下,通常有以下需求:
使用一个方法或者类,一个是提供者,一个是使用者,二者之间的接口是头文件。头文件中声明了方法,在提供者那里方法应该被声明为__declspec(dllexport),在使用者那里,方法应该被声明为__declspec(dllimport)。
二者使用同一个头文件,作为接口,怎么办呢?
解决办法:
使用条件编译:定义一个变量,针对提供者和使用者,设置不同的值。
#ifndef __LABEL_IMAGE_VER1_API_H__
#define __LABEL_IMAGE_VER1_API_H__
#ifdef _LABEL_API_EXPORT_
#define LABEL_IMG_API __declspec(dllexport)
#else
#define LABEL_IMG_API __declspec(dllimport)
#endif
#include <string>
using std::string;
class LABEL_IMG_API ImgLabel
{
public:
ImgLabel(){}
ImgLabel(const string& inpath);
~ImgLabel();
int Start();
};
#endif // __LABEL_IMAGE_VER1_API_H__
使用者未定义LABEL_IMG_API , 所以将ImgLabel声明为了__declspec(dllexport)
本文介绍了动态链接库(DLL)中的导出函数与导入函数的概念,并通过一个具体例子展示了如何利用__declspec(dllexport)和__declspec(dllimport)来实现跨模块的方法调用。文章还讨论了解决提供者和使用者共用同一头文件时的问题。
1130

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



