2 / 2 / 3
Регистрация: 14.11.2016
Сообщений: 82
1

Undefined reference при линковке

12.05.2018, 02:23. Показов 1933. Ответов 2
Метки нет (Все метки)

Здравствуйте, делал реализацию очереди на плюсах. Создал отдельный хедер и исходник для очереди. Пытался через make собрать, но на линковке вылетает:
g++ -o Queue main.o Queue.o
main.o: In function `main':
main.cpp: (.text+0x11): undefined reference to `Queue<int>::Queue()'
main.cpp: (.text+0x22): undefined reference to `Queue<int>::enqueue(int)'
main.cpp: (.text+0x33): undefined reference to `Queue<int>::enqueue(int)'
main.cpp: (.text+0x44): undefined reference to `Queue<int>::enqueue(int)'
main.cpp: (.text+0x50): undefined reference to `Queue<int>:: print()'
main.cpp: (.text+0x5c): undefined reference to `Queue<int>::dequeue()'
main.cpp: (.text+0x68): undefined reference to `Queue<int>:: print()'
main.cpp: (.text+0x79): undefined reference to `Queue<int>::~Queue()'
main.cpp: (.text+0x8c): undefined reference to `Queue<int>::~Queue()'
collect2: error: ld returned 1 exit status
Makefile:14: ошибка выполнения рецепта для цели «Queue»
make: *** [Queue] Ошибка 1

Queue.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef QUEUE_H
#define QUEUE_H
 
template<typename T>
class Queue
{
    public:
        Queue();
        ~Queue();
        void enqueue(T value);
        T dequeue();
        void print();
        void clear();
    private:
        struct node
        {
            T value;
            node *next;
        } *head, *tail;
};
 
#endif
Queue.cpp:
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
#include "Queue.h"
 
template<typename T>
Queue<T>::Queue()
{
    head = tail = nullptr;
}
 
template<typename T>
Queue<T>::~Queue()
{
    clear();
}
 
template<typename T>
void Queue<T>::enqueue(T value)
{
    if(!head)
    {
        head = tail = new node;
        head->value = value;
    }
    else
    {
        node *tmp = new node;
        tmp->value = value;
        tail->next = tmp;
        tail = tmp;
    }
}
 
template<typename T>
T Queue<T>::dequeue()
{
    if(!head)
    {
        throw "Queue is empty";
    }
    
    node *tmp = head;
    int value = head->d;
    head = head->next;
    delete tmp;
}
 
template<typename T>
void Queue<T>::print()
{
    node *tmp = head;
    while(tmp)
    {
        std::cout << tmp->d << (tmp->next) ? " " : "";
        tmp = tmp->next;
    }
}
 
template<typename T>
void Queue<T>::clear()
{
    while(head)
    {
        node *tmp = head;
        head = head->next;
        delete tmp;
    }
}

и, наконец, main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include "Queue.h"
 
int main()
{
    Queue<int> q;
    q.enqueue(10);
    q.enqueue(5);
    q.enqueue(234);
    
    q.print();
    
    q.dequeue();
    
    q.print();
    return 0;
}
Ну и мейкфайл:
Bash
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
.PHONY: all install uninstall clean
 
CPPC = g++
CFLAGS = -c -Wall
LDFLAGS = -o
TARGET = Queue
SRCS = main.cpp $(TARGET).cpp 
OBJS = $(SRCS:.cpp=.o)
INSTALL_PATH = ~/bin
 
all: $(TARGET)
 
$(TARGET): $(OBJS)
    $(CPPC) $(LDFLAGS) $(TARGET) $(OBJS)
    
$(OBJS): $(SRCS)
    $(CPPC) $(CFLAGS) $(SRCS)
 
install: $(TARGET)
    install -D -m 744 $(TARGET) $(INSTALL_PATH)/$(TARGET)
    make clean
        
uninstall: $(TARGET)
    rm -rf $(INSTALL_PATH)/$(TARGET)
    
clean:
    rm -rf $(TARGET) *.o
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.05.2018, 02:23
Ответы с готовыми решениями:

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

ошибка undefined reference to
Всем привет! подскажите, пожалуйста, почему выскакивает ошибка: undefined reference to...

undefined reference to `SQLFreeHandle'
Нашел интересную обертку для ODBC - OTL - 1 заголовочный файл Пытаюсь скомпилировать простую...

Undefined reference to `operator new[](unsigned int)'
Пишу программу на c++, компилирую в gcc 4.8.2. Строка: int* a = new int; приводит к ошибке при...

2
920 / 637 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
12.05.2018, 06:54 2
Цитата Сообщение от Knyaz_Myshkin Посмотреть сообщение
Создал отдельный хедер и исходник для очереди. Пытался через make собрать, но на линковке вылетает:
Компилятор не может создать код шаблона, пока ему не известен реальный тип.
Поэтому реализацию кода шаблонных классов и функций обычно помещают в заголовочные файлы. Для интереса посмотрите заголовки той же libstd++ (stl).
1
2 / 2 / 3
Регистрация: 14.11.2016
Сообщений: 82
12.05.2018, 16:28  [ТС] 3
gng, благодарю. Всё нормально

Добавлено через 8 минут
Для заблудших душ конечный вариант:

Queue.h:
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#ifndef QUEUE_H
#define QUEUE_H
 
#include <iostream>
 
template<typename T>
class Queue
{
    public:
        Queue();
        ~Queue();
        void enqueue(T value);
        T dequeue();
        void print();
        void clear();
    private:
        struct node
        {
            T value;
            node *next;
        } *head, *tail;
};
 
template<typename T>
Queue<T>::Queue():head(nullptr), tail(nullptr)
{}
 
template<typename T>
Queue<T>::~Queue()
{
    clear();
}
 
template<typename T>
void Queue<T>::enqueue(T value)
{
    if(!head)
    {
        head = tail = new node;
        head->value = value;
    }
    else
    {
        node *tmp = new node;
        tmp->value = value;
        tail->next = tmp;
        tail = tmp;
    }
}
 
template<typename T>
T Queue<T>::dequeue()
{
    if(!head)
    {
        throw "Queue is empty";
    }
    
    node *tmp = head;
    int value = head->value;
    head = head->next;
    delete tmp;
    return value;
}
 
template<typename T>
void Queue<T>::print()
{
    node *tmp = head;
    while(tmp)
    {
        const char *blank = (tmp->next) ? " " : "";
        std::cout << tmp->value << blank;
        tmp = tmp->next;
    }
    
    std::cout << std::endl;
}
 
template<typename T>
void Queue<T>::clear()
{
    while(head)
    {
        node *tmp = head;
        head = head->next;
        delete tmp;
    }
}
 
#endif
Makefile:
Bash
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
.PHONY: all install uninstall clean
 
CPPC = g++
CFLAGS = -c -Wall
LDFLAGS = -o
TARGET = Queue
SRCS = main.cpp
OBJS = $(SRCS:.cpp=.o)
INSTALL_PATH = ~/bin
 
all: $(TARGET)
 
$(TARGET): $(OBJS)
    $(CPPC) $(LDFLAGS) $(TARGET) $(OBJS)
    
$(OBJS): $(SRCS)
    $(CPPC) $(CFLAGS) $(SRCS)
 
install: $(TARGET)
    install -D -m 744 $(TARGET) $(INSTALL_PATH)/$(TARGET)
    make clean
        
uninstall: $(TARGET)
    rm -rf $(INSTALL_PATH)/$(TARGET)
    
clean:
    rm -rf $(TARGET) *.o
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.05.2018, 16:28
Помогаю со студенческими работами здесь

Undefined reference в template (Code::Blocks)
Есть шаблонны класс Deque (очередь с двумя концами): template &lt;class Type&gt; class Deque { ...

main.cpp:37: undefined reference to `NMEAParser::ParserBuffer(unsigned char*)
вот написал сие творение (код ниже) выдает ошибку компиляции main.cpp:37: undefined reference to...

непонятное сообщение при линковке
при линковке получаю такое предупреждение: не понятно от чего, почему, и как избавится....

Ошибка undefined reference при запуске программы с sfml
Всем привет! Решил попробовать данную либу (читал статейку на хабре и решил запустить простой...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru