请求“ ”中的成员“ ”,属于 non_clas... Vtable,链接器错误?
request for member ' ' in ' ' which is of non_clas... Vtable, Linker error?
当我在 Win10 x64 机器上 Code::BLocks 16.01 中构建我的项目 (gnu g cc, -std=c++11) 时,头文件包含在项目中,我收到以下错误:
path..\src\Main.cpp|77|undefined reference to `Snmp_pp::UdpAddress::UdpAddress(char const*)'|
path..\snmp_pp\address.h|574|undefined reference to `vtable for Snmp_pp::UdpAddress'|
我还遇到了很多其他未定义的引用错误。
这是我的部分代码,有很多注释行,我跳过了它们。
main.cpp:
#include <stdio.h>
#include "libsnmp.h"
#include "snmp_pp/snmp_pp.h"
using namespace Snmp_pp;
int main (){
long rc;
char buf [256];
char const* ip_address;
ip_address = "192.168.127.250";
Snmp socket_startup();
//Socket Informationen
//Here comes line 77***************************
UdpAddress udp_address(ipaddr);
snmp_version version = version1;
int retries = 1;
int timeout = 100;
u_short port = 161;
OctetStr community ("public");
//SNMP Session öffnen
int status;
Snmp snmp(status, 0,(udp_address.get_ip_version()==Address::version_ipv4));
//SNMP Header Variablen ASN.1 encoding
Pdu pdu;
Vb vb;
//Erstelle OID Objekte
Oid oid("1.3.6.1.2.1.1.1.0"); //sysDescr
vb.set_oid(oid);
pdu+= vb;
**Here comes Line 100**
udp_address.set_port(port);
**Here comes Line 102**
CTarget ctarget(udp_address);
ctartget.set_version(version);
ctartget.set_retry(retries);
ctartget.set_timeout(timeout);
ctartget.set_readcommunity(community);
SnmpTarget *target;
target = &ctartget;
status = snmp.get(pdu, *target);
address.h这里是定义的UdpAddressClass,这是代码的一部分
//------------------------------------------------------------------------
//---------[ UDP Address Class ]------------------------------------------
//------------------------------------------------------------------------
class DLLOPT UdpAddress : public IpAddress
{
public:
/**
* Construct an empty invalid UDP address.
*/
UdpAddress();
/**
* Construct an UDP address from a string.
*
* The following formats can be used additional to those recognized by
* IpAdress:
* - Port added to IPv4 address with '/' or ':'
* ("192.168.17.1:161", "192.168.17.1/161", "printsrv/161")
* - Port added to IPv6 address with '/' or using '[...]:'
* ("::1/162", "[::1]/162", "[::1]:162")
*
* @param inaddr - Hostname or IP address
*/
UdpAddress(const char *inaddr);
/**
* Construct an UDP address from another UDP address.
*
* @param udpaddr - address to copy
*/
UdpAddress(const UdpAddress &udpaddr);
/**
* Construct an UDP address from a GenAddress.
*
* @param genaddr - address to copy
*/
UdpAddress(const GenAddress &genaddr);
/**
* Construct an UDP address from a IP address.
* The port will be set to 0.
*
* @param ipaddr - address to copy
*/
UdpAddress(const IpAddress &ipaddr);
/**
* Return the IP version of the address.
*
* @return one of Address::version_type
*/
virtual version_type get_ip_version() const { return ip_version; }
/**
* Construct an UDP address from a GenAddress.
*
* @param genaddr - address to copy
*/
UdpAddress(const GenAddress &genaddr);
/**
* Construct an UDP address from a IP address.
* The port will be set to 0.
*
* @param ipaddr - address to copy
*/
UdpAddress(const IpAddress &ipaddr);
/**
* Destructor (ensure that SnmpSyntax::~SnmpSyntax() is overridden).
*/
~UdpAddress() {}
包含的头文件来自 HP 公司的 SNMP++3.3.7 项目
Link to Page
我的文件夹结构是:
main_dir\src\main.cpp
main_dir\libsnmp.h
main_dir\snmp_pp\all other header files
这是我的构建输出:
g++.exe -Wall -std=c++11 -g -std=c++11 -I"C:\Users\Kneringer Georg\Documents\CodeBlocks\SNMP_ZIM" -I"C:\Users\Kneringer Georg\Documents\CodeBlocks\SNMP_ZIM\snmp_pp" -c "C:\Users\Kneringer Georg\Documents\CodeBlocks\SNMP_ZIM\src\Main.cpp" -o obj\Debug\src\Main.o
我需要帮助来理解我做错了什么。我猜这是一个链接器错误。
在每个库中(几乎),我们都有两个主要组成部分:
- 包含库中 public 函数声明的头文件
- 定义函数的实现文件
通过包含头文件,你告诉编译器,我有这些函数供你使用,你可以使用它们。在链接阶段,链接器将尝试找到这些函数的实现,但它没有找到它们,这就是您出现该错误的原因。
为了修复错误,您需要在 IDE 中配置链接器路径以告诉他这是包含函数的库。
当我在 Win10 x64 机器上 Code::BLocks 16.01 中构建我的项目 (gnu g cc, -std=c++11) 时,头文件包含在项目中,我收到以下错误:
path..\src\Main.cpp|77|undefined reference to `Snmp_pp::UdpAddress::UdpAddress(char const*)'|
path..\snmp_pp\address.h|574|undefined reference to `vtable for Snmp_pp::UdpAddress'|
我还遇到了很多其他未定义的引用错误。
这是我的部分代码,有很多注释行,我跳过了它们。
main.cpp:
#include <stdio.h>
#include "libsnmp.h"
#include "snmp_pp/snmp_pp.h"
using namespace Snmp_pp;
int main (){
long rc;
char buf [256];
char const* ip_address;
ip_address = "192.168.127.250";
Snmp socket_startup();
//Socket Informationen
//Here comes line 77***************************
UdpAddress udp_address(ipaddr);
snmp_version version = version1;
int retries = 1;
int timeout = 100;
u_short port = 161;
OctetStr community ("public");
//SNMP Session öffnen
int status;
Snmp snmp(status, 0,(udp_address.get_ip_version()==Address::version_ipv4));
//SNMP Header Variablen ASN.1 encoding
Pdu pdu;
Vb vb;
//Erstelle OID Objekte
Oid oid("1.3.6.1.2.1.1.1.0"); //sysDescr
vb.set_oid(oid);
pdu+= vb;
**Here comes Line 100**
udp_address.set_port(port);
**Here comes Line 102**
CTarget ctarget(udp_address);
ctartget.set_version(version);
ctartget.set_retry(retries);
ctartget.set_timeout(timeout);
ctartget.set_readcommunity(community);
SnmpTarget *target;
target = &ctartget;
status = snmp.get(pdu, *target);
address.h这里是定义的UdpAddressClass,这是代码的一部分
//------------------------------------------------------------------------
//---------[ UDP Address Class ]------------------------------------------
//------------------------------------------------------------------------
class DLLOPT UdpAddress : public IpAddress
{
public:
/**
* Construct an empty invalid UDP address.
*/
UdpAddress();
/**
* Construct an UDP address from a string.
*
* The following formats can be used additional to those recognized by
* IpAdress:
* - Port added to IPv4 address with '/' or ':'
* ("192.168.17.1:161", "192.168.17.1/161", "printsrv/161")
* - Port added to IPv6 address with '/' or using '[...]:'
* ("::1/162", "[::1]/162", "[::1]:162")
*
* @param inaddr - Hostname or IP address
*/
UdpAddress(const char *inaddr);
/**
* Construct an UDP address from another UDP address.
*
* @param udpaddr - address to copy
*/
UdpAddress(const UdpAddress &udpaddr);
/**
* Construct an UDP address from a GenAddress.
*
* @param genaddr - address to copy
*/
UdpAddress(const GenAddress &genaddr);
/**
* Construct an UDP address from a IP address.
* The port will be set to 0.
*
* @param ipaddr - address to copy
*/
UdpAddress(const IpAddress &ipaddr);
/**
* Return the IP version of the address.
*
* @return one of Address::version_type
*/
virtual version_type get_ip_version() const { return ip_version; }
/**
* Construct an UDP address from a GenAddress.
*
* @param genaddr - address to copy
*/
UdpAddress(const GenAddress &genaddr);
/**
* Construct an UDP address from a IP address.
* The port will be set to 0.
*
* @param ipaddr - address to copy
*/
UdpAddress(const IpAddress &ipaddr);
/**
* Destructor (ensure that SnmpSyntax::~SnmpSyntax() is overridden).
*/
~UdpAddress() {}
包含的头文件来自 HP 公司的 SNMP++3.3.7 项目
Link to Page
我的文件夹结构是:
main_dir\src\main.cpp
main_dir\libsnmp.h
main_dir\snmp_pp\all other header files
这是我的构建输出:
g++.exe -Wall -std=c++11 -g -std=c++11 -I"C:\Users\Kneringer Georg\Documents\CodeBlocks\SNMP_ZIM" -I"C:\Users\Kneringer Georg\Documents\CodeBlocks\SNMP_ZIM\snmp_pp" -c "C:\Users\Kneringer Georg\Documents\CodeBlocks\SNMP_ZIM\src\Main.cpp" -o obj\Debug\src\Main.o
我需要帮助来理解我做错了什么。我猜这是一个链接器错误。
在每个库中(几乎),我们都有两个主要组成部分:
- 包含库中 public 函数声明的头文件
- 定义函数的实现文件
通过包含头文件,你告诉编译器,我有这些函数供你使用,你可以使用它们。在链接阶段,链接器将尝试找到这些函数的实现,但它没有找到它们,这就是您出现该错误的原因。
为了修复错误,您需要在 IDE 中配置链接器路径以告诉他这是包含函数的库。