现在一般工程都比较多,很多情况下都有基础的一些工具库,关于库的导出和其他工程引用这个库的时候有些需要注意的,这里记录一下,以便学习。
一般在要导出的库里都会有如下的宏定义:目的是代码简洁
#ifndef _DLL_H_
#define _DLL_H_//防重复定义
#if BUILDING_DLL
#define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
#define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */
#endif /* _DLL_H_ */</span>
然后在要导出的类前加上这个导出声明。
如下所示:
class DLLIMPORT MyClass
{
public:
void DoSomething();
};
然后在cpp文件中会有DoSomething的实现。
如果你的一个类里全部是内联函数,cpp文件里没有内容,那么这个类其实你就可以不用导出了,因为只有包含这个头文件,这个类的所有功能都能实现。
但是如果这个类里有定义一个静态变量,如下:
class MyClass
{
public:
void DoSomething()
{
//...
}
DLLIMPORT static int s_iMyint;
};
这个时候这个静态变量必须在cpp文件里初始化。而且如果要用到它的话,你就必须将它导出。即在你的工程里
__declspec(dllexport) 导出这个变量,
而且特殊的是,在其他工程引用这个库的时候需要
__declspec(dllimport)导入这个变量。
这个时候最开始的那个宏就很有用了,一般你的基础库工程里都有 BUILDING_DLL
这个定义,对应 DLLIMPORT _declspec(dllexport)
所以在基础库里是导出这个变量,在你的其他工程里,没有BUILDING_DLL
这个定义,所以这个工程里包含这个头文件时,其实对应DLLIMPORT _declspec(dllimport)
这样就实现了导入和导出两个操作了。