1 / 1 / 0
Регистрация: 19.01.2013
Сообщений: 46
1

Ошибка multiply definition константы

21.10.2021, 01:41. Показов 815. Ответов 12
Метки нет (Все метки)

Ошибка multiply definition константы
Проект состоит из:
- класс шаблонный одномерный массив ArrayTemplate: .cpp, .h
- класс шаблонный 2-мерный массив на основе одномерного Array2DTemplate1: .cpp, .h
- класс шаблонный 2-мерный массив Array2DTemplateSelf: .cpp, .h (изначально 2-мерный рваный массив, использует 1-мерный массив для выдачи или записи строки или столбца)
- модуль MyLib: .cpp, .h с всякими функциями, которые используют все эти файлы
- main.cpp для их тестирования.
Все работало, но вот я в mylib.h определил константу.
Используется только в функциях в mylib.cpp.
Включаются файлы так:
MyLib.h:
#include<iostream>
#include<QString>
#include<stdio.h>
ArrayTemplate.h:
#include "mylib.h"
Array2DTemplate1.h:
#include "arraytemplate.h"
Array2DTemplateSelf.h:
#include "array2dtemplate1.h"
#include<vector>
main.cpp:
#include <QCoreApplication>
#include "array2dtemplate1.h"
#include "array2dtemplateself.h"
Остальные .cpp - включают только одноименные .h

Полностью ошибки выглядят так:
multiple definition of 'BoolValByDflt' arraytemplate.cpp
first defined here main.cpp
multiple definition of 'BoolValByDflt' mylib.cpp
first defined here stdio.h 297
multiple definition of 'BoolValByDflt' array2dtemplatel.cpp
first defined here stdio.h 297
multiple definition of 'BoolValByDflt' array2dtemplateself.cpp
first defined here stdio.h 297
error: Id returned 1 exit status collect2.exe

В stdio.h эти строки выглядят так:
__mingw_ovr
__attribute__((__format__ (gnu_printf, 1, 2))) __MINGW_ATTRIB_NONNULL(1)
int printf (const char *__format, ...)
{
register int __retval;
__builtin_va_list __local_argv; __builtin_va_start( __local_argv, __format );
__retval = __mingw_vprintf( __format, __local_argv );
__builtin_va_end( __local_argv );
return __retval;
Строка 297 - это открытая скобочка

Погуглил, у кого-то компилятор ругался что функция multiply definition. Ему пишут, что линковщик включает только .cpp, а так как в нескольких .cpp он видит функцию, то мол вот поэтому и multiply definition, рекомендовали сделать функцию inline.

Тогда решил опробовать. Создал аналогичный проект попроще, воспроизвел ситуацию:
unit1.h
C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef UNIT1_H
#define UNIT1_H
 
#include<iostream>
#include<stdio.h>
 
const int C=0;
 
int Increment(int x);
 
#endif // UNIT1_H
unit 1.cpp
C++
1
2
3
4
5
#include "unit1.h"
 
int Increment(int x){
    return x+C+1;
}
unit 2.h
C++
1
2
3
4
5
6
7
8
#ifndef UNIT2_H
#define UNIT2_H
 
#include"unit1.h"
 
int Function2(int x);
 
#endif // UNIT2_H
unit2.cpp
C++
1
2
3
4
5
#include "unit2.h"
 
int Function2(int x){
    return C+10*Increment(x);
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <QCoreApplication>
 
#include"unit2.h"
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    int x=2;
    int y=Function2(x)+Increment(x)+C;
    //cout<<"x="<<x<<" y= "<<y<<endl;
    printf("x=%d y=%d\n",x,y);
    return a.exec();
}
Тут все работает!
Так и не пойму, чего там ругается.
Компилятор Qt.
Помогите разобраться!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2021, 01:41
Ответы с готовыми решениями:

Multiple definition для константы
Есть некий заголовочный файл с набором констант, который нужен во многих классах: #ifndef...

Ошибка: one or more multiply defined symbols found
Пишу программу на C++, все нормально работала, компилировалась, потом добавил строчку коментариев,...

Ошибка multiple definition
cl.h #ifndef PR1_CL_H #define PR1_CL_H #include &lt;iostream&gt; #include &quot;general.h&quot; class...

Ошибка multiple definition
В строке 4 компилятор выдает ошибку &quot;multiple definition of 'fin'&quot;. Проблема в том, что в этой...

12
1476 / 934 / 282
Регистрация: 25.01.2019
Сообщений: 2,355
21.10.2021, 01:47 2
aviacheslav,
Не объявляй переменные в хедерах.
0
1 / 1 / 0
Регистрация: 19.01.2013
Сообщений: 46
21.10.2021, 02:49  [ТС] 3
Folian, переменные да, а тут константа. Я хотел, чтобы эту константу видели несколько модулей. Как тогда быть? И почему во 2- проекте работает, а в 1-м - нет?
0
1476 / 934 / 282
Регистрация: 25.01.2019
Сообщений: 2,355
21.10.2021, 02:58 4
Цитата Сообщение от aviacheslav Посмотреть сообщение
переменные да, а тут константа.
Константа тоже человек.
Цитата Сообщение от aviacheslav Посмотреть сообщение
Как тогда быть?
extern
...
или чёнить вроде int myconst(){ return 26; }
Цитата Сообщение от aviacheslav Посмотреть сообщение
И почему во 2- проекте работает, а в 1-м - нет?
мож ты только один раз этот хедер подрубаешь - тогда может и пропустить такое (всё равно нельзя).
0
С чаем беда...
Эксперт CЭксперт С++
10013 / 5359 / 1467
Регистрация: 18.10.2014
Сообщений: 12,926
21.10.2021, 05:52 5
Цитата Сообщение от aviacheslav Посмотреть сообщение
Все работало, но вот я в mylib.h определил константу.
Так где это определение этой вашей "константы"??? Где код? К чему все эти рассказы, если реальное определение не приведено?

Цитата Сообщение от Folian Посмотреть сообщение
Константа тоже человек.
Нет, константа не может вызвать такой ошибки.

Цитата Сообщение от Folian Посмотреть сообщение
extern
...
или чёнить вроде int myconst(){ return 26; }
Зачем страдать фигней, вместо того, чтобы разобраться в проблеме? Ясно, что ТС что-то выдумывает.
1
1476 / 934 / 282
Регистрация: 25.01.2019
Сообщений: 2,355
21.10.2021, 14:22 6
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Нет, константа не может вызвать такой ошибки.
Ага. Они по-умолчанию static ж и действительно не могут.
Да, мой косяк.
0
1 / 1 / 0
Регистрация: 19.01.2013
Сообщений: 46
21.10.2021, 14:46  [ТС] 7
А если я хочу определить модуль MyMathLib - там будет много функций и физических констант. Будет .h и .cpp, где будет реализация этих функций. И этот MyMathLib будет полдключаться к как минимум еще одному модулю, где будет запрограммирован расчет, т.е. у него будет свой .cpp.
Так что, так нельзя? Все будет multipy declartation?
А функции
Цитата Сообщение от Folian
int myconst(){ return 26; }
писать inline?
0
зомбяк
1562 / 1211 / 345
Регистрация: 14.05.2017
Сообщений: 3,929
21.10.2021, 15:00 8
C++
1
2
3
4
5
6
7
8
#ifndef UNIT1_H
#define UNIT1_H
 
extern const int C;
 
int Increment(int x);
 
#endif // UNIT1_H
C++
1
2
3
4
5
6
7
#include "unit1.h"
 
const int C = 0; 
 
int Increment(int x){
    return x+C+1;
}
Добавлено через 4 минуты
Цитата Сообщение от aviacheslav Посмотреть сообщение
класс шаблонный одномерный массив ArrayTemplate: .cpp, .h
Вынести все шаблоны из .cpp в .h . В .сpp нужно оставлять всё, что не связано с шаблонами.
0
1 / 1 / 0
Регистрация: 19.01.2013
Сообщений: 46
21.10.2021, 15:45  [ТС] 9
В о всех 3 шаблонных классах .cpp файлы у меня пустые.

Добавлено через 40 минут
Кроме подключений .h файлов в них ничего нет

О! А вот еще!
Удалил из проекта:
array2dtemplatel: .cpp, .h; array2dtemplateself: .cpp, .h.
Остались
arraytemplate: .cpp, .h;
MyLib: .cpp, .h;
Main.cpp

Ошибка осталась для всех файлов, которые остались в проекте:

multiple definition of 'BoolValByDflt' arraytemplate.cpp
first defined here main.cpp
multiple definition of 'BoolValByDflt' mylib.cpp
first defined here stdio.h 297
error: Id returned 1 exit status collect2.exe
0
16094 / 8692 / 2124
Регистрация: 30.01.2014
Сообщений: 14,985
21.10.2021, 16:04 10
aviacheslav, надо не добавлять\удалять файлы по наитию, или в сиюминутном порыве выполнить совет с форума, а разобраться в понятии linkage (связывание) в C++. Тогда жизнь сразу начнет налаживаться.
0
1 / 1 / 0
Регистрация: 19.01.2013
Сообщений: 46
21.10.2021, 16:41  [ТС] 11
Цитата Сообщение от DrOffset Посмотреть сообщение
надо не добавлять\удалять файлы по наитию, или в сиюминутном порыве выполнить совет с форума
Да дело в том, что проблема впервые появилась, когда файлов было больше, чем я описал. Ныне я еще сократил проект - теперь до 2 модулей, и проблема осталась. Методом исключения ошибку ищу.
За ссылку спасибо, будем изучать
0
С чаем беда...
Эксперт CЭксперт С++
10013 / 5359 / 1467
Регистрация: 18.10.2014
Сообщений: 12,926
21.10.2021, 18:26 12
Цитата Сообщение от TRam_ Посмотреть сообщение
C++
1
extern const int C;
Это для того, чтобы помешать компилятору оптимизировать код, такую бессмыслицу предлагается сделать?

Цитата Сообщение от aviacheslav Посмотреть сообщение
Ошибка осталась для всех файлов, которые остались в проекте:
Еще раз: почему вы до сих пор не привели объявление этого вашего BoolValByDflt?

Цитата Сообщение от aviacheslav Посмотреть сообщение
Методом исключения ошибку ищу.
Никакого "метода исключения" в ваших манипуляциях нет и никакой "метод исключения" тут не применим. Разумеется, ошибка пропадет, когда в проекте останется только одна единица трансляции, но это ничем не поможет.
0
1 / 1 / 0
Регистрация: 19.01.2013
Сообщений: 46
21.10.2021, 22:48  [ТС] 13
Товарищи, вопрос снят. Прошу меня извинить.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Еще раз: почему вы до сих пор не привели объявление этого вашего BoolValByDflt?
Сначала я думал, что проект большой. Вырисовывал схему связей между файлами .h
Теперь проект сократился, хотел привести весь проект, благо он маленький.
В ответ на эту цитату я хотел ответить: а что ее приводить? Ну, const bool BoolValByDflt=true;
И увидел: слово const я упустил!
Перед ней была еще одна константа const int - там слово const было, а перед этой следующей - уже отсутствовало.
Дописал его - и заработало!
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
константа не может вызвать такой ошибки. ... Ясно, что ТС что-то выдумывает.
Я не специально, но, получается, так и вышло. Еще раз прошу прощения и спасибо всем!
Админы, мне кажется, тему стоит удалить.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.10.2021, 22:48
Помогаю со студенческими работами здесь

Ошибка: multiple definition of `arr'
Добрый день. Как можно исправить ошибку: multiple definition of `arr' Вот сам код BHeap.h ...

Ошибка multiple definition при сборке в QT Creator
Через консоль (c помощью g++) программа компилируется и запускается без ошибок В QT Creator не...

Ошибка multiple definition of main при наследовании
Всем привет. Проблема описана много где в интернете , но я так и не смог понять в чём косяк у...

Шаблоны классов. Ошибка `unable to match function definition to an existing declaration`
#pragma once template &lt;typename T = int&gt; class SingleBuffer { public: SingleBuffer(T fd):...

Ошибка: Function definition is not allowed here и Expected expression среда xCode forMacOS
Не могу устранить ошибки. Что я сделал не так? ссылка на скрин ошибки1, и ошибки2 #include...

Multiple definition для константы
Есть некий набор констант, который нужен во многих классах: #ifndef RCCCONSTS_H #define...

Ошибка multiple definition
Ошибка multiple definition of `SocketTest::bytesWritten(long long)' подскажите в чем проблема ...


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

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

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