С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 10.06.2013
Сообщений: 16
1

Ошибки underfined reference to parentClass::method и unerfined reference to vtable при линковке

21.10.2015, 23:26. Показов 1913. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
При сборке компилятор выдает ошибки underfined reference to и unerfined reference to vtable. Есть базовый класс, два наследуемых от него и тестирующая программа.

Базовый класс ConfigNodeBase:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#ifndef CONFIGBASE_H_
#define CONFIGBASE_H_
#include <sstream>
#include <stdint.h>
#include <fstream>
#include <cstring>
#include <stdio.h>
#include <memory>
#include <map>
#include <vector>
 
struct  ConfigNode;
 
typedef std::shared_ptr<std::multimap<ConfigNode*,ConfigNode*> > ConfigNodeMap;
typedef std::pair<std::string, std::string> strPair;
typedef std::pair<ConfigNode*, ConfigNode*> nodePair;
typedef std::pair <std::multimap<ConfigNode*,ConfigNode*>::iterator, std::multimap<ConfigNode*,ConfigNode*>::iterator> itrPair;
 
struct ConfigNode
{
    ConfigNode* parent;
    ConfigNodeMap children;
    virtual ~ConfigNode(){};
};
 
struct ConfigNodeTag : ConfigNode
{
    std::string name;
    std::map<std::string, std::string> attribs;
};
struct  ConfigNodeValue : ConfigNode
{
    std::string value;
};
 
class ConfigNodeBase
{
    public:
        ConfigNodeBase();
        ~ConfigNodeBase();
        virtual bool load(const std::string& filename)=0;
    protected:
        ConfigNode* top;
};
#endif /*CONFIGBASE_H_*/

И два отнаследованных от него класса:
ConfigNodeJson

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef CONFIGNODEJSON_H
#define CONFIGNODEJSON_H
#include "jsoncpp/json/json.h"
#include "ConfigNodeBase.h"
 
class ConfigNodeJson : public ConfigNodeBase
{
    public:
        bool load(const std::string& filename);
    private:
        void    nextNode(const Json::Value &root, ConfigNode* parentNode);
};
 
#endif
ConfigNodeXml

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef CONFIGNODEXML_H
#define CONFIGNODEXML_H
#include <tinyxml.h>
#include "ConfigNodeBase.h"
 
class ConfigNodeXml : public ConfigNodeBase
{
    public: 
        bool load(const std::string& filename);
    private:
        void    nextNode(TiXmlElement *parentElem, ConfigNode *parentNode);
} ;
 
#endif
сама тестирующая программа:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//test.cpp
#include "ConfigNodeXml.h"
#include "ConfigNodeJson.h"
#include <gtest/gtest.h>
 
using namespace std;
 
ConfigNodeJson configJson;
ConfigNodeXml   configXml;
 
class ConfigNodeTest : public ::testing::Test {
    protected:
    virtual void SetUp()
    {}
    
    virtual void TearDown()
    {}
};
 
TEST(ConfigNodeTest, DefaultConstructorTest)
{
    configJson.load("jsonExample.json");    
    configXml.load("example.xml");
}
мейкфайл для сборки(да, корявый, я знаю):

CLIBS = -ljsoncpp -ltinyxml -lgtest -lgtest_main -lpthread
CFLAGS = -std=c++11 -g

all: test


test: test.o ConfigNodeJson.o ConfigNodeXml.o
g++ $(CFLAGS) test.o -o Test $(CLIBS)

main.o: main.cpp ConfigNodeJson.h ConfigNodeJson.cpp
g++ $(CFLAGS) -c main.cpp

test.o: test.cpp ConfigNodeJson.h ConfigNodeJson.cpp ConfigNodeXml.h ConfigNodeXml.cpp ConfigNodeBase.h ConfigNodeBase.cpp
g++ $(CFLAGS) -c test.cpp ConfigNodeBase.cpp

ConfigNodeJson.o: ConfigNodeJson.h ConfigNodeJson.cpp ConfigNodeBase.h ConfigNodeBase.cpp
g++ $(CFLAGS) -c ConfigNodeJson.cpp ConfigNodeBase.cpp

ConfigNodeXml.o: ConfigNodeXml.h ConfigNodeXml.cpp ConfigNodeBase.h ConfigNodeBase.cpp
g++ $(CFLAGS) -c ConfigNodeXml.cpp ConfigNodeBase.cpp


clean:
rm -rf *.o Test

и собственно сам набор ошибок

make test (в каталоге: /home/whatareyoulookingfor/workspace/ConfigNodeBase)
g++ -std=c++11 -g -c test.cpp ConfigNodeBase.cpp
g++ -std=c++11 -g -c ConfigNodeJson.cpp ConfigNodeBase.cpp
g++ -std=c++11 -g test.o -o Test -ljsoncpp -ltinyxml -lgtest -lgtest_main -lpthread
test.o: In function `ConfigNodeTest_DefaultConstructorTest_Test::TestBody()':
/home/anton/workspace/ConfigNodeJson/test.cpp:30: undefined reference to `ConfigNodeJson::load(std::string const&)'
/home/anton/workspace/ConfigNodeJson/test.cpp:31: undefined reference to `ConfigNodeXml::load(std::string const&)'
test.o: In function `ConfigNodeJson::ConfigNodeJson()':
/home/anton/workspace/ConfigNodeJson/ConfigNodeJson.h:8: undefined reference to `ConfigNodeBase::ConfigNodeBase()'
/home/anton/workspace/ConfigNodeJson/ConfigNodeJson.h:8: undefined reference to `vtable for ConfigNodeJson'
test.o: In function `ConfigNodeXml::ConfigNodeXml()':
/home/anton/workspace/ConfigNodeJson/ConfigNodeXml.h:7: undefined reference to `ConfigNodeBase::ConfigNodeBase()'
/home/anton/workspace/ConfigNodeJson/ConfigNodeXml.h:7: undefined reference to `vtable for ConfigNodeXml'
test.o: In function `ConfigNodeJson::~ConfigNodeJson()':
/home/anton/workspace/ConfigNodeJson/ConfigNodeJson.h:8: undefined reference to `vtable for ConfigNodeJson'
/home/anton/workspace/ConfigNodeJson/ConfigNodeJson.h:8: undefined reference to `ConfigNodeBase::~ConfigNodeBase()'
test.o: In function `ConfigNodeXml::~ConfigNodeXml()':
/home/anton/workspace/ConfigNodeJson/ConfigNodeXml.h:7: undefined reference to `vtable for ConfigNodeXml'
/home/anton/workspace/ConfigNodeJson/ConfigNodeXml.h:7: undefined reference to `ConfigNodeBase::~ConfigNodeBase()'
collect2: error: ld returned 1 exit status
Сборка завершилась с ошибкой.
make: *** [test] Ошибка 1
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.10.2015, 23:26
Ответы с готовыми решениями:

Undefined reference при линковке
Здравствуйте, делал реализацию очереди на плюсах. Создал отдельный хедер и исходник для очереди....

Ошибка undefined reference to `assert_param при линковке
У меня не получается скомпилировать проект в консоли. Ошибка та, которая хорошо гуглится, которую...

При линковке: Undefined reference to std::count
Написал простейшую программу на c++: #include &lt;iostream&gt; void _start(){ std::cout &lt;&lt;...

undefined reference to `vtable for
Вылетает эта ошибка при компиляции вот этого класса: class BrassPlus : public AcctABC { private:...

3
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.10.2015, 23:59 2
вам же на чистом английском написали:
нет туловищ конструкторов/диструкторов,
и некоторых функций-членов

например:

C++
1
2
3
4
5
6
7
8
9
class ConfigNodeBase
{
    public:
        ConfigNodeBase();
        ~ConfigNodeBase();
        virtual bool load(const std::string& filename)=0;
    protected:
        ConfigNode* top;
};
где реализации конструктора и диструктора?

или:

C++
1
2
3
4
5
6
7
class ConfigNodeXml : public ConfigNodeBase
{
    public: 
        bool load(const std::string& filename);
    private:
        void    nextNode(TiXmlElement *parentElem, ConfigNode *parentNode);
} ;
где реализация метода load ?
0
0 / 0 / 0
Регистрация: 10.06.2013
Сообщений: 16
22.10.2015, 00:54  [ТС] 3
Реализация методов в отдельных cpp файлах: ConfigNodeBase.cpp, ConfigNodeJson.cpp и ConfigNodeXml.cpp.
такого вида:
C++
1
2
3
#include "ConfigNodeXml.h"
 
bool ConfigNodeXml::load(const std::string &filename) {return true;}
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
22.10.2015, 09:11 4
Лучший ответ Сообщение было отмечено Aratori как решение

Решение

Цитата Сообщение от Aratori Посмотреть сообщение
g++ $(CFLAGS) test.o -o Test $(CLIBS)
А чего линкуется-то только один объектник, когда их у тебя несколько?
1
22.10.2015, 09:11
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.10.2015, 09:11
Помогаю со студенческими работами здесь

Undefined reference to 'vtable for Touch'
Я не понимаю, что я неправильно делаю Input/InputDevice.hpp #ifndef INPUTDEVICE_HPP #define...

Q_OBJECT undefined reference to vtable
Не могу понять почему ругается компилер на виртуальные таблицы при добавлении макроса Q_OBJECT....

Undefined reference to `vtable for Vim'
Привет всем! пользуесь линуксом...установил qt creator 2.7.2 qt 5.1.0 ... написал самый простой...

Undefined reference to `vtable for MClas'
Обнаглел настолько, что решил попробовать себя в самостоятельном творчестве И получил такую ошибку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru