Страницы

Поиск по вопросам

понедельник, 17 июня 2019 г.

Ошибка: multiple definition of в QWidget

Есть *.h файл со следующим кодом:
#ifndef CORECOMMANDS_H #define CORECOMMANDS_H #pragma once #include #include
struct MassageDataIn{ QString operationId; QStringList names; QStringList values; };
//Запрос базовых параметров ядра const MassageDataIn cmdSetupRequest(){ MassageDataIn massageData; massageData.operationId = "12"; return massageData; } //Запрос состояния ядра const MassageDataIn cmdSync(){ MassageDataIn massageData; massageData.operationId = "11"; return massageData; }
Данный файл писался в консольном приложении и работал без всяких ошибок. После создания консольного приложение возникла надобность использования его в уже в QWidget приложении. При попытке скомпилировать проект на начальной стадии (только создал стандартный проект QWidget и подключил этот и еще несколько файлов, предварительно скопировав его с консольного проекта) получаю ошибку:
14: ошибка: multiple definition of 'cmdSetupRequest()' UI\corecommands.h:14: first defined here UI\debug\core.o:-1: In function `Z7cmdSyncv':
На форуме вычитал, что добавление inline и extern решают данную проблему и это действительно так. НО! Почему в консольном приложении можно обойтись без них, а в QWidget нет? Если все таки можно исправить эти ошибки без добавления inline и extern то как это можно сделать.
p.s. pragma once стоит во всех *.h файлах


Ответ

Определение не inline функций должно быть в файле реализации, т.е. *.cpp. Когда заголовочный файл подключается к разным файлам реализации, получается, что разные модули имеют в своём составе одинаковые функции. Линкеру плохеет и он говорит ошибку типа этой:
multiple definition of `cmdSetupRequest()'
Ну и не хватает #endif в Вашем файле. Да и одновременное использовать разные include-guard как-то через чур всё же.

Комментариев нет:

Отправить комментарий