Есть *.h файл со следующим кодом:
#ifndef CORECOMMANDS_H
#define CORECOMMANDS_H
#pragma once
#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 как-то через чур всё же.
Комментариев нет:
Отправить комментарий