Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
59 / 3 / 0
Регистрация: 26.01.2019
Сообщений: 31

Ошибка "undefined reference to"

17.07.2021, 22:07. Показов 4077. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Был у меня огромный C++ модуль на 5к строк и решил я порубать его на .cpp и .h файлы. Конечно изначально был .cxx и .h , но переименовка проблему не решила :/ Использую CxxDroid для андроида... По ощущениям используется нормальный компилятор и NDK, так что наврядли пролема в самой проге ;'-} Пока начал отделять утилиты из той горы кода ^_^
Знаю о существовании string модуля, так что помидорами не закидывать, а самой сильной стороной Bytes является возможность создавать строки форматироварием на основе sprintf, при том размер новой строки вычисляется автоматически через Bytes::Sizer ;'-}

Файл UtilsASD.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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
#include <stdlib.h>
#include <map>
//Модуль map совмещает в себе то, что вводит:
//va_list, va_start, va_end...
//std::forward
//strlen, видимо задействован string модуль...
//Используется активно в паре с Bytes::hash там, где я ещё не разделял Bytes на .cpp и .hpp чтобы из карты делать хештаблицы ;'-}
 
#include "UtilsASD.h"
 
using namespace std;
 
uint adler32(uint adler, text buf, uint len, uint pos) {
    uint s1 = adler & 0xffff;
    uint s2 = (adler >> 16) & 0xffff;
    uint n = 0;
    while (len != 0) {
        n = len > 2000 ? 2000 : len;
        len -= n;
        do {
            s1 += buf[pos++];
            s2 += s1;
        } while (--n);
        s1 %= 65521;
        s2 %= 65521;
    }
    return s1 | s2 << 16;
}
uint* crc32genTable() {
    uint *Arr = new uint[256];
    for(uint n = 0; n < 256; n++) {
        uint c = n;
        for(uint k = 0; k < 8; k++) c = c & 1 ? 0xEDB88320 ^ (c >> 1) : c >> 1;
        Arr[n] = c;
    }
    return Arr;
}
uint* crc32table = crc32genTable();
uint crc32(uint crc, text buf, uint len, uint pos) {
    crc ^= -1;
    uint end = pos + len;
    for(uint i = pos; i < end; i++) crc = (crc >> 8) ^ crc32table[(crc ^ buf[i]) & 0xFF];
    return crc ^ -1;
}
 
text HexArr = "0123456789ABCDEF";
text HexArr2 = "0123456789abcdef";
 
//Bytes::Bytes() {}
Bytes::Bytes(text Str) {
    Len = strlen(Str);
    Data = new char[Len + 1];
    memcpy((ubyte*) Data, Str, Len + 1);
}
Bytes::Bytes(text D, ulong L) {
    Len = L;
    Data = new char[Len + 1];
    memcpy((ubyte*) Data, D, Len + 1);
}
void Bytes::set(text D, ulong L) {
    delete[] Data;
    Data = new char[Len + 1];
    memcpy((ubyte*) Data, D, Len + 1);
}
uint Bytes::Sizer(text F, ...) {
    //printf("Format: %s\n", F);
    uint Pos = 0, Size = 0;
    va_list args;
    va_start(args, F);
    while (true) {
        switch(F[Pos++]) {
        case '%':
            Repeat:
            switch(F[Pos++]) {
            case 'l': goto Repeat;
            case '\x00': goto End;
            case '0' ... '9': case '-': goto Stop;
            case 's': {
                text s = va_arg(args, text);
                //printf("Text: %s\n", s);
                if (s != NULL) Size += strlen(s);
                break; }
            case 'd': {
                long long d = va_arg(args, long long);
                //printf("Dec: %lld\n", d);
                while (true) {
                    d /= 10;
                    Size++;
                    if (d == 0) break;
                }
                break; }
            case 'f': {
                double f = va_arg(args, double);
                char *buff = new char[400];
                sprintf(buff, "%lf", f);
                Size += strlen(buff);
                break; }
            default: goto Stop;
            }
        break;
        case '\x00': goto End;
        default: Size++;
        }
    }
    va_end(args);
    End:
    //printf("Size: %u\n", Size);
    return Size;
    Stop:
    printf("STOP. Size: %u\n", Size);
    exit(0);
}
 
Bytes::Bytes(text Sep, uint N, Bytes *Arr) {
    uint SepLen = strlen(Sep);
    Len = SepLen * (N - 1);
    for(uint i = 0; i < N; i++) Len += Arr[i].len();
    char *Res = new char[Len + 1];
    uint Pos = 0;
    for(uint i = 0; i < N; i++) {
        Bytes Item = Arr[i];
        const char *Text = Item.str();
        uint LItem = Item.len();
        if (i > 0)
            for(uint j = 0; j < SepLen; j++) Res[Pos++] = Sep[j];
        for(uint j = 0; j < LItem; j++) Res[Pos++] = Text[j];
    }
    Res[Len] = char(0);
    Data = Res;
}
Bytes::Bytes(const Bytes &obj) {
    Len = obj.Len;
    Data = new char[obj.Len];
    memcpy((ubyte*) Data, obj.Data, Len);
}
Bytes::~Bytes() {
    printf("Dec: %lu   %lu\n", (ulong) this, (ulong) Data);
    delete[] Data;
}
Bytes Bytes::operator+(text Str) {
    int Len2 = 0;
    for(; Str[Len2] > 0; Len2++) {}
    int SumL = Len + Len2;
    char *Res = new char[SumL + 1];
    for(int i = 0; i < Len; i++) Res[i] = Data[i];
    for(int i = 0; i < Len2; i++) Res[i + Len] = Str[i];
    Res[SumL] = char(0);
    return Bytes(Res, SumL);
}
Bytes Bytes::operator+(Bytes Str) {
    int Len2 = Str.Len;
    int SumL = Len + Len2;
    char *Res = new char[SumL + 1];
    for(int i = 0; i < Len; i++) Res[i] = Data[i];
    for(int i = 0; i < Len2; i++) Res[i + Len] = Str.Data[i];
    Res[SumL] = char(0);
    return Bytes(Res, SumL);
}
void Bytes::print() {
    char B;
    printf("PRINT\n");
    for(int i = 0; i < Len; i++) {
        B = Data[i];
        printf("%c%c", HexArr[B / 16], HexArr[B % 16]);
        if (i % 16 == 15 || i + 1 == Len) printf("\n");
        else if (i % 8 == 7) printf(" | ");
        else printf(" ");
    }
}
void Bytes::print2() {
    char B;
    printf("PRINT\n");
    for(int i = 0; i < Len + 5; i++) {
        B = Data[i];
        printf("%3u", B);
        if (i % 16 == 15 || i + 1 == Len + 5) printf("\n");
        else if (i % 8 == 7) printf(" | ");
        else printf(" ");
    }
}
char* Bytes::Hex() {
    char *Res = new char[Len * 3];
    char B;
    for(int i = 0; i < Len; i++) {
        B = Data[i];
        Res[i * 3] = HexArr[B / 16];
        Res[i * 3 + 1] = HexArr[B % 16];
        Res[i * 3 + 2] = ' ';
    }
    Res[Len * 3 - 1] = char(0);
    return Res;
}
bool Bytes::equals(text A) {
    for(int i = 0; i < Len; i++)
        if (Data[i] != A[i]) return false;
    return true;
}
ulong Bytes::hash() {
    ulong A = crc32(0x4f5e6d7c + Len, Data, Len, 0);
    uint B = adler32(0xb0a19283 - Len, Data, Len, 0);
    return A << 32 | B;
}
byte Bytes::TestBM(Bytes &B) {
    uint L = Len < B.Len ? Len : B.Len;
    for(uint i = 0; i < L; i++) {
        char CA = Data[i], CB = B.Data[i];
        //if (CA >= 'A' && CA <= 'Z') CA += 32;
        //if (CB >= 'A' && CB <= 'Z') CB += 32;
        if (CA < CB) return -1;
        if (CA > CB) return 1;
    }
    if (Len == B.Len) return 0;
    return Len < B.Len ? -1 : 1;
}
template<typename ... Args>
Bytes::Bytes(int, text F, Args &&...params) {
    Len = Sizer(F, std::forward<Args>(params)...);
    char *Buf = new char[Len + 1];
    sprintf(Buf, F, std::forward<Args>(params)...);
    Data = Buf;
}
void Test() {
    Bytes b("XD");
    printf("Text: %s\n", b.str());
    Bytes XD(0, "%d 10 %d\n", 9, 11);
    printf("Res: %s\n", XD.str());
    Bytes bb = b;
    Bytes c = b;
    printf("XD\n");
}
 
int main(int argc, char *argv[]) {
    Test();
    printf("XD2\n");
}
Файл UtilsASD.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
typedef signed char byte;
typedef unsigned char ubyte;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned long ulong;
typedef const char* text;
 
uint adler32(uint adler, text buf, uint len, uint pos);
uint crc32(uint crc, text buf, uint len, uint pos);
 
class Bytes {
private:
    text Data = 0;
    ulong Len;
public:
    Bytes() {}
    Bytes(text Str);
    Bytes(text D, ulong L);
    void set(text D, ulong L);
    uint Sizer(text F, ...);
    template<typename ... Args>
    Bytes(int, text F, Args &&...params);
    Bytes(text Sep, uint N, Bytes *Arr);
    Bytes(const Bytes &obj);
    ~Bytes();
    Bytes operator+(text Str);
    Bytes operator+(Bytes Str);
    void print();
    void print2();
    char* Hex();
    bool equals(text A);
    text str() { return Data; }
    ulong len() { return Len; }
    ulong hash();
    byte TestBM(Bytes &B);
};
Файл UtilsTest.cpp:
C++
1
2
3
4
5
6
7
#include "UtilsASD.h"
#include <stdlib.h>
 
int main(int argc, char *argv[]) {
    Bytes b(0, "Maychinato %d", 10);
    printf("Str: %s\n Len: %lu Hash: %lu\n", b.str(), b.len(), b.hash());
}
Результат вывода UtilsASD.cpp:
Code
1
2
3
4
5
6
7
8
9
10
11
Text: XD
Res: 9 10 11
 
XD
Dec: 549447133240   491304075552
Dec: 549447133256   491304075544
Dec: 549447133280   491304083456 //Тут тестится конструктор копирования, т.к. деконструктор НЕ должен срабатывать на одной и той же text Data; дважды там, где delete[] Data;
Dec: 549447133312   491304075536 //И ещё раз тестится конструктор копирования :S
XD2
 
[Program finished]
Ошибка в UtilsTest.cpp:
Code
1
2
3
4
5
6
/data/user/0/ru.iiec.cxxdroid/cache/iiec_tmp_source_file-fdb57d.o: In function `main':
/storage/emulated/0/C++/UtilsTest.cpp:(.text+0x44): undefined reference to `Bytes::Bytes<int>(int, char const*, int&&)'
/storage/emulated/0/C++/UtilsTest.cpp:(.text+0x6c): undefined reference to `Bytes::hash()'
/storage/emulated/0/C++/UtilsTest.cpp:(.text+0x9c): undefined reference to `Bytes::~Bytes()'
/storage/emulated/0/C++/UtilsTest.cpp:(.text+0xc8): undefined reference to `Bytes::~Bytes()'
clang-5.0: error: linker command failed with exit code 1 (use -v to see invocation)
В конечном счёте NDK превратит .o в .so и скорость будет рельсотронная ;'-}}} Но это произойдёт только, если не будет ошибок ;'-} Также прога вообще не лагает на 5к строках :S Зато ожидание, когда копилятор переварит всё это и подпишет жёлтыми волнистыми линиями все места варнингов, а красными - с ошибкой, пройдёт месяц ;'-} Все .cpp и .h файлы компилятся отдельно, вот и делю, но для такого разделения не достаточно тупо .cpp создать, суть в том, что он не проходится по отделённым .cpp, а только по .h (в смысле отделённые части .cpp уже будут скомпилированы, а не в том смысле, что он вообще пропустит отделённые .cpp, кроме запускаемого... По .h он определяет варнинги и ошибки для помечания волнистыми линиями)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.07.2021, 22:07
Ответы с готовыми решениями:

Странная ошибка: [Linker error] undefined reference to `__dyn_tls_init_callback' [Linker error] undefined reference to ld returned 1 exit status
Здравствуйте. Вот недавно начал изучать книгу &quot;С++ для чайников&quot; Стефан Р. Девис 4-е издание. И напоролся на кучу ошибок) Но смог все...

Ошибка undefined reference
Вот такая функция: void InitFMOD(){ FMOD_RESULT result; FMOD::System *system; result =...

Ошибка undefined reference to
main.cpp #include &lt;locale&gt; #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &quot;Class.h&quot; using namespace std; int main() { ...

10
фрилансер
 Аватар для Алексей1153
6442 / 5636 / 1127
Регистрация: 11.10.2019
Сообщений: 14,983
17.07.2021, 22:12
Цитата Сообщение от VectorASD Посмотреть сообщение
template<typename ... Args>
    Bytes(int, text F, Args &&...params);
тело функции нужно перенести в заголовок. То есть в файл UtilsASD.h
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,178
17.07.2021, 22:13
Лучший ответ Сообщение было отмечено VectorASD как решение

Решение

Цитата Сообщение от VectorASD Посмотреть сообщение
template<typename ... Args>
Bytes::Bytes(int, text F, Args &&...params) {
Почему у вас определение шаблонного метода вдруг попало в .cpp файл?

Что касается остальных ненайденных символов, то возникает вопрос: а вы вообще компилируете ваш UtilsASD.cpp как часть вашего проекта? И как это вообще должно компилироваться, если в обоих файлах у вас есть функция main???
1
59 / 3 / 0
Регистрация: 26.01.2019
Сообщений: 31
17.07.2021, 22:18  [ТС]
К вопросу это не относится, но тем, кто стырит код Bytes...
Нашёл утечку памяти в Sizer, так что заменил строчку на char buff[400]; там, где было new. Деконструкторы и конструкторы копировария я вообще позовчера освоил, по этому осталась маленькая недоделочка в этом посте :S
0
фрилансер
 Аватар для Алексей1153
6442 / 5636 / 1127
Регистрация: 11.10.2019
Сообщений: 14,983
17.07.2021, 22:22
Цитата Сообщение от VectorASD Посмотреть сообщение
char buff[400]
уже изобретён std::string
1
59 / 3 / 0
Регистрация: 26.01.2019
Сообщений: 31
17.07.2021, 22:46  [ТС]
Как оказывается, для того, чтобы UtilsASD.cpp был виден, нужно было объединить всю шайтан машину в проект, а т.к. у меня была одна гора в виде 5к строчного кода, то проекты в CxxDroid ещё не освоивал, по этому думал, что он сразу всё увидит ;'-}

Добавлено через 8 минут
уже изобретён std::string
А разве умеет ли он выделять столько памяти, сколько нужно для sprintf? Вот Bytes и умеет ;'-} Я его создавал ещё в начале того, что выросло в 5к строк, а ведь это сначало было hello_world'ом, вот и хотелось отказаться от string модуля, а состряпать велик, при том очень удачный :S

Добавлено через 1 минуту
В опере при выделении текста не вылезает цитата О_о возможно так теряются оповещения того, что у человека текст цитировали тут, если ручками :/

Добавлено через 5 минут
Ясно, что оказывается .h файл не сделает такую видимость, буд-то main функции нет, что зря, т.к. я не смогу тестить отдельно модули (хотя смысл)... Так что я убрал лишний main...

Как будет правильно отделить template функцию от .cpp в .h? Как и функциями достапа str и len делать?
0
фрилансер
 Аватар для Алексей1153
6442 / 5636 / 1127
Регистрация: 11.10.2019
Сообщений: 14,983
17.07.2021, 22:50
Цитата Сообщение от VectorASD Посмотреть сообщение
А разве умеет ли он выделять столько памяти, сколько нужно для sprintf
конечно умеет

и умеет вообще обходиться без sprintf
std::to_string
std::stringstream

Добавлено через 2 минуты
Цитата Сообщение от VectorASD Посмотреть сообщение
Как будет правильно отделить template функцию от .cpp в .h?
не надо отделять, просто перенеси в тело определения класса
1
59 / 3 / 0
Регистрация: 26.01.2019
Сообщений: 31
17.07.2021, 23:00  [ТС]
Короче говоря закрываю тему, т.к. тупо перекирул шаблонный метод из .cpp в .h и подрубил модуль map там для него... Так что самое главное было соединить в проект эти файлы (до чего я в жизни бы не догадался) ;'-} Просто на питоне нет никаких заголовков и всё соединяется и без них, по этому переход на C++ оказался для меня в диковинку. На форуме уже видел то, почему шаблоны надо савать в .h, так что больше мне нечего делать тут

Добавлено через 5 минут
1.) Свои эмодзи пропали, а рук-лайков и рук-силы тут нопь 2.) Видимо админы закрывают темы, а не их создатели :S
0
фрилансер
 Аватар для Алексей1153
6442 / 5636 / 1127
Регистрация: 11.10.2019
Сообщений: 14,983
17.07.2021, 23:00
Цитата Сообщение от VectorASD Посмотреть сообщение
Просто на питоне нет никаких заголовков и всё соединяется и без них, по этому переход на C++ оказался для меня в диковинку
подсказываю лайфхак - найди любую книжку по C++ для начинающих, там это всё в самом начале будет описано. Не нужно будет экспериментировать так долго ))
1
59 / 3 / 0
Регистрация: 26.01.2019
Сообщений: 31
18.07.2021, 00:10  [ТС]
Алексей1153, Sololearn приложение использовал, но для большей эффективности не стал его проходить на 100%, а где-то на 30% остановился на изучении C++ и пошёл делать свой helloworld, итог: 5к строчек кода на масштабном "проекте"
0
фрилансер
 Аватар для Алексей1153
6442 / 5636 / 1127
Регистрация: 11.10.2019
Сообщений: 14,983
18.07.2021, 14:24
Цитата Сообщение от VectorASD Посмотреть сообщение
приложение использовал
я ж говорю - книжку почитай, а не тест-опросник
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.07.2021, 14:24
Помогаю со студенческими работами здесь

ошибка undefined reference to `_imp___ZN2sf5Image12loadFromFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE'|
Привет! Такая проблема: подключил sfml к codeblocks и скопировал тестовый код, все работает. но когда пытаюсь загрузить изображение выдает...

Ошибка . undefined reference to
При компиляции вылетает указанная ниже ошибка. В чем может быть проблем? Linux Часть кода #include &lt;pulse/simple.h&gt; #include...

Ошибка `undefined reference to`
Выскакивает вот такая вот ошибка: undefined reference to ?Подскажите, пожалуйста, как это исправить? И еще рядом с file.h находится...

Ошибка undefined reference to
Взял пример из учебника С++ изнутри (Вайнер), но при попытке скомпилировать программу, возникают ошибки (gcc компилятор) ...

Ошибка undefined reference to
При сборке выбивает ошибку: undefined reference to `Atom:: DoBCC(float, int, int, int)'. Ткните носом, пожалуйста, где ошибка. Заранее...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru