读书人

前辈们近来看一下写dll时候的link异常

发布时间: 2012-02-09 18:22:27 作者: rapoo

前辈们近来看一下写dll时候的link错误!!!!在线等 急!!!!!!!!!!!!!!
我今天在编写一个dll的时候出现下面的现象帮忙看看,在编写这个Dll的时候会调用到这3个lib文件 (libdes.lib agent++.lib snmp++.lib)

如果我单写Point的类的Dll 编译测试没有任何问题,它同样需要引用(libdes.lib agent++.lib snmp++.lib)

但是当我把sysInformation_1和computerName_1这两个类加入以后就会出现这3个link错误, 我觉得 是我在写这两个类的时候继承了 MibGroup 和 MibLeaf 这两个类的原因
但是这两个类所用的头文件和lib我已经加入到里面了,link的时候还是出现下面的错误,大家帮我看看下面的错误什么意思, 如何可以避免,主要代码我都献上了
agentdll error LNK2019: unresolved external symbol "__declspec(dllimport)
const computerName_1::`vftable ' " (__imp_??_7computerName_1@@6B@) referenced
in function "public: __thiscall computerName_1::computerName_1(void) "
(??0computerName_1@@QAE@XZ)
agentdll error LNK2019: unresolved external symbol "__declspec(dllimport)
const sysInformation_1::`vftable ' " (__imp_??_7sysInformation_1@@6B@)
referenced in function "public: __thiscall
sysInformation_1::sysInformation_1(void) " (??0sysInformation_1@@QAE@XZ)
agentdll error LNK2019: unresolved external symbol "__declspec(dllimport)
public: virtual __thiscall computerName_1::~computerName_1(void) "
(__imp_??1computerName_1@@UAE@XZ) referenced in function "public: virtual
void * __thiscall computerName_1::`scalar deleting destructor '(unsigned
int) " (??_GcomputerName_1@@UAEPAXI@Z)


头文件send_trap.h如下:
#include <agent_pp/mib.h>
#include <agent_pp/snmp_counters.h>
#include <string>
#include <agent_pp/agent++.h>
#include <vector>

class DLL1_API Point
{
public:
void output(int c, int y);
void test();
};

class DLL1_API sysInformation_1:public MibGroup
{
public:
sysInformation_1();
};

class DLL1_API computerName_1:public MibLeaf
{
public:
computerName_1();
void get_request(Request*,int);
};

#endif


源文件如下:
#include "send_trap.h "
#include "snmp_pp/snmp_pp.h "

#define oidSysInformation_1 "1.3.6.1.2.2.0 "
#define oidComputerName_1 "1.3.6.1.2.2.1.0 "

computerName_1::computerName_1():MibLeaf(oidComputerName_1, READONLY, new
OctetStr())
{

}

/**
* @brief 发送计算机名
*
* 发送计算机名
* @param req 服务器的请求
* @param index 请求的索引
* @return 无
*/

void computerName_1::get_request(Request* req,int index)
{

*((OctetStr*)value) = "hellloooo!!! ";
MibLeaf::get_request(req, index);
}


sysInformation_1::sysInformation_1(): MibGroup(oidSysInformation_1,
"oidSysInformation_1 ")
{

MibIIsnmpCounters::reset();
add(new computerName_1());

}


void Point::test()
{

Snmp::socket_startup();
Oid trapid( "1.3.6.1.2.1.39.0 ");
Pdu trap_pdu;


char *key = "172.16.30.23 ";//strIpAddress;
int status;
Snmp *snmp1;
snmp1 = new Snmp(status, "0.0.0.0 ");
if ( status != SNMP_CLASS_SUCCESS)
{
//return FALSE;
}
u_short port = 162;
snmp_version version=version1;
OctetStr community( "public ");
//trapid = oid;
trap_pdu.set_notify_id( trapid);
UdpAddress addr(key);
addr.set_port(port);
CTarget ctarget(addr);
ctarget.set_version( version);
ctarget.set_readcommunity( community);
SnmpTarget *target = &ctarget;
Vb vb_trap(trapid);
vb_trap.set_value( "5555 ");
trap_pdu += vb_trap;
int status1 = snmp1-> trap( trap_pdu,* target);
if ( status != SNMP_CLASS_SUCCESS)
{
//return FALSE;
}
// return TRUE;
Snmp::socket_cleanup();

}

link时候的错误:
agentdll error LNK2019: unresolved external symbol "__declspec(dllimport)
const computerName_1::`vftable ' " (__imp_??_7computerName_1@@6B@) referenced
in function "public: __thiscall computerName_1::computerName_1(void) "
(??0computerName_1@@QAE@XZ)
agentdll error LNK2019: unresolved external symbol "__declspec(dllimport)
const sysInformation_1::`vftable ' " (__imp_??_7sysInformation_1@@6B@)
referenced in function "public: __thiscall
sysInformation_1::sysInformation_1(void) " (??0sysInformation_1@@QAE@XZ)
agentdll error LNK2019: unresolved external symbol "__declspec(dllimport)
public: virtual __thiscall computerName_1::~computerName_1(void) "
(__imp_??1computerName_1@@UAE@XZ) referenced in function "public: virtual
void * __thiscall computerName_1::`scalar deleting destructor '(unsigned
int) " (??_GcomputerName_1@@UAEPAXI@Z)


如果我单写Point的类的Dll 编译测试没有任何问题,它同样需要引用


[解决办法]
从错误的提示中看出,是没有找到外部符号,编译器认为两个类的构造函数是外部连接的__declspec(dllimport),而在外部又没有找到,所以报错。
lz企图使用开关DLL1_API实现同一个dll头文件既能在编译dll时使用,又能提供给exe使用,但是编译dll时,lz并没有切换开关,加入语句#define DLL1_API __declspec(dllexport)。其实如果不需要把整个类导出时,不需要在类声明前加DLL1_API。
[解决办法]
应该是dllexport吧``宏切换没有啊

读书人网 >VC/MFC

热点推荐