我写了这样一个DLL,导出一个类,不过类中几乎都是静态成员:
// VDSendEvent.h: interface for the VDSendEvent class.
//
//////////////////////////////////////////////////////////////////////#if !defined(AFX_VDSENDEVENT_H__2F2DFE01_DFB5_4282_B5D8_DC5D01428F61__INCLUDED_)
#define AFX_VDSENDEVENT_H__2F2DFE01_DFB5_4282_B5D8_DC5D01428F61__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "windows.h"
#include "winbase.h"
#include "VDController.h"class __declspec(dllexport) VDSendEvent  
{
public:
VDSendEvent();
virtual ~VDSendEvent();
public:
void static setVDController(VDController* pVDController)
{
_pVDController=pVDController;
}
static VDController*  getVDController()
{
return _pVDController;
}
void static run();
void static close();
static int tmeint;
static VDController* _pVDController;
private:
    static DWORD WINAPI ThreadFunc(LPVOID lpParam );
private:
static HANDLE hThread;

};#endif // !defined(AFX_VDSENDEVENT_H__2F2DFE01_DFB5_4282_B5D8_DC5D01428F61__INCLUDED_)这里可以主要看一下static int tmeint这个成员,我是用这个做实验,所以放到public中。
我在主程序中想调用它:
#include "VDController.h"
#include "VDSendEvent.h"void main()
{
VDController* pVDController=new VDController(); VDSendEvent::tmeint=9;
VDSendEvent::_pVDController=NULL;
VDSendEvent::run();
VDSendEvent::close();
}结果出错了:
--------------------Configuration: testFunction - Win32 Debug--------------------
Compiling...
test.cpp
Linking...
   Creating library Debug/testFunction.lib and object Debug/testFunction.exp
test.obj : error LNK2001: unresolved external symbol "public: static class VDController *  VDSendEvent::_pVDController" (?_pVDController@VDSendEvent@@2PAVVDController@@A)
test.obj : error LNK2001: unresolved external symbol "public: static int  VDSendEvent::tmeint" (?tmeint@VDSendEvent@@2HA)
Debug/testFunction.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.testFunction.exe - 3 error(s), 0 warning(s)请问高手们,这是怎么回事呢。
如果不写成DLL,这样调用应该是直接可以的,是不是和DLL有关呢?

解决方案 »

  1.   

    VDSendEvent.cpp中有没有加入类似以下的两行
    int VDSendEvent::tmeint=0;
    VDController* VDSendEvent::_pVDController=NULL;
      

  2.   

    当我们完成DLL功能模块时,我们要讲DLL中的功能函数导出成规则的函数名。因为C++编译器在编译的时候会对函数名进行改编,这样我们想调用自己DLL中的函数就会遇到困难,所以我们要指定要导出的函数的名称,这样才能方便我们的调用。
        有两种方法可以解决以上问题:
        方法一:
       在要导出的全局函数名之前加上这样一句:  extern "C"  _declspec(dllexport) 它表明,将一个DLL中的函数导出,并且遵守标准C的调用约定。
        方法二:
        使用模块定义文件(.def),并将其加入到工程中,添加如下代码:
        LIBRARY  (动态链接库名)
        EXPORTS  (以下列出要导出的函数名)
      

  3.   

    问题是我的程序里函数没有问题。是这样的,我要导出的类里有个静态成员,当我把它做成私有的时候,用公有函数来访问它,做成DLL,然后在别的程序里通过函数改变静态成员的值没有问题,但是当我把静态成员放到公有的时候,做成DLL,在别的程序里直接改变这个值,联接不上这个变量。