我写了这样一个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有关呢?
// 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有关呢?
解决方案 »
- 我感觉COM组件只需要接口GUID+类型库GUID,对象GUID做什么的?
- DLL 中的CALLBACK 函数问题
- 多少个tick是一毫秒啊?
- 极难的问题。*****有人通过网络邻居向我发送了一个文本文件,我怎样获取这样的消息*****
- 这里人多,问个dhtml问题,关于window.closed
- 【跪求高手解决】socket网络编程在接收大量不同类型数据时如何处理
- 父进程的内核对象句柄表中有没有子进程的内核句柄?
- 为什么多数绘图程序都喜欢创建一个Canvas类?
- 求助 如何利用connect实现网站重定向
- 关于 ADO 下的 SELECT * FROM table WHERE
- 关于静态库导出C++类的问题,老大们都来,100分
- 如何让计时器一启动就开始运行,不用等??标题说不清楚,大家进来坐坐!
int VDSendEvent::tmeint=0;
VDController* VDSendEvent::_pVDController=NULL;
有两种方法可以解决以上问题:
方法一:
在要导出的全局函数名之前加上这样一句: extern "C" _declspec(dllexport) 它表明,将一个DLL中的函数导出,并且遵守标准C的调用约定。
方法二:
使用模块定义文件(.def),并将其加入到工程中,添加如下代码:
LIBRARY (动态链接库名)
EXPORTS (以下列出要导出的函数名)