dll导出函数与静态成员变量的奇怪现象,望前辈指点~
写了个regular dll,大致定义如下:
class CField
{
...
public:
_declspec(dllexport) CField*GetParent();
_declspec(dllexport) CField*GetLeftField();
_declspec(dllexport) void Debug();
protected:
_declspec(dllexport) virtual voidInitVariable();
...
protected:
CField*pParent;
CField*pLeftNeighbor;
CField*pRightNeighbor;
CField*pFirstChild;
CField*pLastChild;
static const BYTE*pucData; //cpp文件中有定义
static intnDataLen; //cpp文件中有定义
...
};
dll成功编译,主程序A调用dll。
问题一:
我直接把这个定义的h文件包含在主程序A中,_declspec(dllexport)声明没有改成_declspec(dllimport),为啥A程序使用正常?
问题二:
对于指针变量如pParent等,既没有在dll中声明为_declspec(dllexport),也没有在A中声明为_declspec(dllimport),但也能正确使用?(不知道是不是还有其他类型变量也可以这样使用)
问题三:
pucData与nDataLen为静态成员变量,但是在A无法直接使用,否则报nDataLen无法解析。但是如果在dll声明中给nDataLen加上_declspec(dllexport),在A声明中给nDataLen加上_declspec(dllimport)就可以了。静态变量与非静态变量有什么不同呢?
[解决办法]
1 看看A的导出表
2 C++规定 有声明就可以使用
3 见 2
导出的时候一般整体导出一个类。
[解决办法]
补充问题2的回复
如果连接的时候找不到对应的变量定义,那么就会报连接错误。如果你在dll中导出了,就可以连接通过。