Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как победить multiple definition, которого в явном виде нет? / 18 сообщений из 18, страница 1 из 1
22.02.2011, 09:26
    #37129669
Dymanovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить multiple definition, которого в явном виде нет?
Написал программу в Qt, хочу откомпилировать и отладить, а он мне выдаёт:

QT./debug\test.o: In function `Z11systemTimerv':

C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/test.cpp:6: multiple definition of `systemTimer()'

./debug\main.o:C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest//test.cpp:6: first defined here

./debug\test.o: In function `Z15mod_bus_HoldRegt':

C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/test.cpp:11: multiple definition of `mod_bus_HoldReg(unsigned short)'

./debug\main.o:C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest//test.cpp:11: first defined here

./debug\test.o: In function `Z11excludeUnitR15PowerManagementR10CommonDataRKh':

C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/test.cpp:34: multiple definition of `excludeUnit(PowerManagement&, CommonData&, unsigned char const&)'

./debug\main.o:C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest//test.cpp:34: first defined here

./debug\test.o: In function `Z16writeOutputStateR10CommonData':

C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/test.cpp:48: multiple definition of `writeOutputState(CommonData&)'

./debug\main.o:C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest//test.cpp:48: first defined here

./debug\test.o: In function `Z18writeOutputResultsPA5_11Measurement':

C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/test.cpp:57: multiple definition of `writeOutputResults(Measurement (*) [5])'

./debug\main.o:C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest//test.cpp:57: first defined here

./debug\test.o: In function `Z14changeUDefinedR15PowerManagementRK13USetupDefinedRh':

C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/test.cpp:330: multiple definition of `changeUDefined(PowerManagement&, USetupDefined const&, unsigned char&)'

./debug\main.o:C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest//test.cpp:330: first defined here

./debug\test.o: In function `Z12changeURangeR15PowerManagementRK11USetupRangeRt':

C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/test.cpp:345: multiple definition of `changeURange(PowerManagement&, USetupRange const&, unsigned short&)'

./debug\main.o:C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest//test.cpp:345: first defined here

./debug\test.o: In function `Z12checkResultsR15PowerManagementR10CommonDataPA5_11MeasurementhPA4_K8DblRange':

C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/test.cpp:1055: multiple definition of `checkResults(PowerManagement&, CommonData&, Measurement (*) [5], unsigned char, DblRange const (*) [4])'

./debug\main.o:C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest//test.cpp:1055: first defined here

collect2: ld returned 1 exit status

mingw32-make[1]: *** [debug\ACTest.exe] Error 1

mingw32-make: *** [debug] Error 2

Процесс "C:/Qt/2010.04/mingw/bin/mingw32-make.exe" завершился с кодом %2.

Хотя всё объявлено один раз. синтаксис должен соответствовать С99. Что я не так делаю?
...
Рейтинг: 0 / 0
22.02.2011, 09:28
    #37129672
Dymanovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить multiple definition, которого в явном виде нет?
Файл после нажатия "Предварительный просмотр" открепился - глюк форума.
...
Рейтинг: 0 / 0
22.02.2011, 11:02
    #37129951
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить multiple definition, которого в явном виде нет?
DymanovskyХотя всё объявлено один раз

main.cpp:
#include "test.cpp"

Из-за этого тела функций, объявленных в test.cpp, дублируются в двух разных единицах трансляции: main.cpp и test.cpp

Вообще include применяется только для включения заголовков *.h, в которых описываются только прототипы, но не тела функций.
Бывают исключения (генерация однотипного кода), но не в подобных случаях: нет ни единой причины включать одни *.cpp из проекта в другие.
...
Рейтинг: 0 / 0
22.02.2011, 11:11
    #37129975
Dymanovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить multiple definition, которого в явном виде нет?
Я тут уже по разному переставлять пробовал. Это один из варинатов. Если писать в стиле С, то тела всех статических функций должны находится в .h?

А то я писал в .cpp

static void foo () {
//...
}

а потом в .h
static void foo () ;

Он ругался в .h на undefined reference, а в .cpp, что функция не используется.
...
Рейтинг: 0 / 0
22.02.2011, 11:27
    #37130010
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить multiple definition, которого в явном виде нет?
Функции, которые должны быть видимы в нескольких единицах трансляции, не должны быть static (ни тело ни прототип).
В *.h - поместить прототипы
в *.cpp - тела ф-й

В те *.cpp, где нужно использовать функцию, включить соответствующий *.h
...
Рейтинг: 0 / 0
22.02.2011, 12:54
    #37130265
Dymanovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить multiple definition, которого в явном виде нет?
Все функции, которые должны быть видны в других модулях сделал обычными, остальные static. Он ругается на переменные, что они объявлены несколько раз. Что ещё не так? Или нельзя обращаться к глобальным переменным из статических функций?
...
Рейтинг: 0 / 0
22.02.2011, 13:15
    #37130329
Dymanovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить multiple definition, которого в явном виде нет?
Попробовал сделать все функции обычными (не static) - один чёрт.
...
Рейтинг: 0 / 0
22.02.2011, 13:36
    #37130386
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить multiple definition, которого в явном виде нет?
DymanovskyОн ругается на переменные, что они объявлены несколько раз. Что ещё не так? потому что не так всё с глобальными переменными в C++
...
Рейтинг: 0 / 0
22.02.2011, 14:17
    #37130508
Dymanovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить multiple definition, которого в явном виде нет?
И всё равно не помогает.
вынес в.cpp

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
char gaugesExchange[gaugesCount];

float measurements [portCount][measurementsCount];утсройства

unsigned short regModBus[regModBusSize];

float coeffTable [portCount][measurementsCount];

struct PowerData powerData;


Оставил в .h

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
extern char gaugesExchange[/*gaugesCount*/];

extern float measurements [][measurementsCount];

extern unsigned short regModBus[];

extern float coeffTable [][measurementsCount];

extern struct PowerData powerData;

//И даже в конце

extern int test(bool reset =  0 );

все константы оставил в .h и сделал static.

Но он почему то упорно считает, что переменная
Код: plaintext
gaugesExchange
объявлена в
Код: plaintext
1.
2.
3.
static quint64 systemTimer(){
    quint64 time = GetTickCount();
    return time;
}

дважды. Не понимаю как скомпилировать эту программу. Что тут не так?????
...
Рейтинг: 0 / 0
22.02.2011, 14:48
    #37130599
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить multiple definition, которого в явном виде нет?
Dymanovsky,

Забыл, что объявил ее еще где-то.

Пора бросать думать, начинать промывать мозг )
...
Рейтинг: 0 / 0
22.02.2011, 14:51
    #37130606
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить multiple definition, которого в явном виде нет?
DymanovskyНо он почему то упорно считает...

Приведите сообщение об ошибке и последний вариант исходников.
...
Рейтинг: 0 / 0
22.02.2011, 14:52
    #37130608
Dymanovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить multiple definition, которого в явном виде нет?
Поиском по файлам проекта проверил. переменная gaugesExchange объявлена в одном месте.
...
Рейтинг: 0 / 0
22.02.2011, 15:10
    #37130644
Dymanovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить multiple definition, которого в явном виде нет?
Последний вариант исходников в файле.

Сообщения об ошибках

(Уже 2-й день мучаюсь)

Qt creator + min-gw./debug\test.o: In function `systemTimer':

C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/test.cpp:21: multiple definition of `gaugesExchange'

./debug\main.o:C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/main.cpp:8: first defined here

./debug\test.o: In function `mod_bus_HoldReg':

C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/test.cpp:26: multiple definition of `measurements'

./debug\main.o:C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/main.cpp:9: first defined here

./debug\test.o: In function `excludeUnit':

C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/test.cpp:56: multiple definition of `regModBus'

./debug\main.o:main.cpp:(.bss+0x120): first defined here

./debug\test.o: In function `jumpLoad':

C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/test.cpp:1057: multiple definition of `coeffTable'

./debug\main.o:main.cpp:(.bss+0x2120): first defined here

./debug\test.o: In function `checkResults':

C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/test.cpp:1088: multiple definition of `powerData'

./debug\main.o:main.cpp:(.bss+0x2220): first defined here

./debug\testemu.o: In function `Z11emuLoadDatav':

C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/testemu.cpp:6: multiple definition of `gaugesExchange'

./debug\main.o:C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/main.cpp:8: first defined here

./debug\testemu.o: In function `Z11emuLoadDatav':

C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/testemu.cpp:8: multiple definition of `measurements'

./debug\main.o:C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/main.cpp:9: first defined here

./debug\testemu.o: In function `Z11emuLoadDatav':

C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/testemu.cpp:37: multiple definition of `regModBus'

./debug\main.o:main.cpp:(.bss+0x120): first defined here

./debug\testemu.o:testemu.cpp:(.bss+0x2120): multiple definition of `coeffTable'

./debug\main.o:main.cpp:(.bss+0x2120): first defined here

./debug\testemu.o:testemu.cpp:(.bss+0x2220): multiple definition of `powerData'

./debug\main.o:main.cpp:(.bss+0x2220): first defined here

collect2: ld returned 1 exit status

mingw32-make[1]: *** [debug\ACTest.exe] Error 1

mingw32-make: *** [debug] Error 2

Процесс "C:/Qt/2010.04/mingw/bin/mingw32-make.exe" завершился с кодом %2.
Возникла ошибка при сборке проекта ACTest (цель: Настольный компьютер)
Во время выполнения сборки на этапе "Сборка"
...
Рейтинг: 0 / 0
22.02.2011, 15:52
    #37130771
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить multiple definition, которого в явном виде нет?
DymanovskyQt creator + min-gw./debug\test.o: In function `systemTimer':

C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/test.cpp:21: multiple definition of `gaugesExchange'

./debug\main.o:C:\Users\Alexander.Dumanovski\Documents\QT_Projects\ACTest-build-desktop/../ACTest/main.cpp:8: first defined here


Данные ошибки ссылаются на строки в которых нет соответствующих имен.
Т.е. либо это ошибки к другой версии исходников, либо при сборке некорректно отслеживаются зависимости и часть модулей не перекомпилировалось при изменении исходников.
Начните с удаления всех *.o
Если не поможет - будем смотреть дальше.
...
Рейтинг: 0 / 0
24.02.2011, 08:44
    #37132965
Dymanovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить multiple definition, которого в явном виде нет?
Уррраааааа! запустил. Интересно, это глюк gcc?
...
Рейтинг: 0 / 0
24.02.2011, 12:29
    #37133453
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить multiple definition, которого в явном виде нет?
DymanovskyУррраааааа! запустил. Интересно, это глюк gcc?
Если удаление *.o помогло, то это значит что система сборки некорректно отслеживает зависимости.
GCC тут не причем, он всего лишь компилирует что ему скажут.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
19.08.2013, 15:22
    #38370791
unregistred_grin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить multiple definition, которого в явном виде нет?
реанимирую форум для тех, кто придёт сюда позже по ссылке гугла ( как и я ) =)

проблема была в том, что в *.pro файл (проектный файл в Qt) дважды был включён один и тот же *.cpp файл с определением функции.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
04.12.2014, 13:59
    #38824855
Помогло
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как победить multiple definition, которого в явном виде нет?
unregistred_grinреанимирую форум для тех, кто придёт сюда позже по ссылке гугла ( как и я ) =)

проблема была в том, что в *.pro файл (проектный файл в Qt) дважды был включён один и тот же *.cpp файл с определением функции.

И правда! Благодарю.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как победить multiple definition, которого в явном виде нет? / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]