2016-09-08 5 views
0

Когда я построить мой проект (ГНУ г куб.см, -std = C++ 11) в Code :: Blocks 16.01 на Win10 x64 Machine, заголовочные файлы включены в проект, я получаю следующие ошибки:запрос для участника '' in '', который имеет non_clas ... Vtable, ошибка Linker?

путь .. \ src \ Main.cpp | 77 | неопределенная ссылка на `Snmp_pp :: UdpAddress :: UdpAddress (char const *) '|

путь .. \ snmp_pp \ address.h | 574 | неопределенная ссылка на `vtable для 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 Здесь определен UdpAddress класса, это часть кода

//------------------------------------------------------------------------ 
//---------[ 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
Моя папка st ructure является:

main_dir\src\main.cpp 
main_dir\libsnmp.h 
main_dir\snmp_pp\all other header files 

Heres мой вывод сборки:

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 

мне нужна помощь с пониманием того, что я сделал неправильно. Я предполагаю, что это ошибка Linker.

+0

[Этот вопрос] (https://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and-how-do-ixfix?rq= 1), найденный в правой части самой страницы, на которую вы сейчас смотрите, скорее всего, описывает то, что вы видите, и тактику для ее решения. – WhozCraig

+0

Я изучил это, знаете ли вы, имеет ли значение, когда команда -L перед командами -o? В настоящее время это выглядит так: mingw32-g ++. Exe -L "<полный путь к main_dir>" -o bin \ Debug \ .exe obj \ Debug \ src \ Main.o -L -Lsnmp_pp \ "полные пути к заголовку файлы " – Eggi

+0

, и насколько я могу прочитать Main.o, есть запись с UdpAddress. – Eggi

ответ

2

В каждой библиотеке (почти), у нас есть два основных компонента:

  • файлы заголовков, содержащие декларацию государственных функций в библиотеке
  • файлы реализации, где определены функции

Включая файлы заголовков, вы сообщаете компилятору, у меня есть эти функции в моем распоряжении, вы можете их использовать. Во время фазы связывания линкер попытается найти реализацию этих функций, но он не находит их, поэтому у вас есть эта ошибка.

Чтобы исправить ошибку, вам необходимо настроить путь компоновщика в вашей среде IDE, чтобы сообщить ему, что это lib, содержащий функции.

+1

@Eggi, если у вас есть эти ошибки, это означает, что компоновщик не находит требуемый файл/lib для реализации, поэтому вам нужно перепроверить настройки компоновщика. – Mansuro

+1

«В ** каждой ** библиотеке» немного слишком сильная, поскольку вы можете писать только для заголовков. Разумеется, такие библиотеки вряд ли смогут связываться из-за неопределенных функций, поэтому * эта * библиотека, вероятно, не только для заголовков. – user2079303

+0

@ user2079303 Да, правда, я отредактировал свой ответ – Mansuro