ODB: нерешенная внешняя ошибка символа при включении файла * .hxx с общими объявлениями

Я должен использовать Рамки ODB в моем проекте. У меня есть 2 файла: station.hxx а также common.hxx со следующим содержанием:

common.hxx

#ifndef COMMON_HXX
#define COMMON_HXX

#include <string>

#pragma db value
struct ProcessAggregateName
{
#pragma db column("SHORTNAME")
std::string SHORTNAME;
#pragma db column("LONGNAME")
std::string LONGNAME;
#pragma db column("SECONDARYNAME")
std::string SECONDARYNAME;
};

#pragma db value
struct Reporting
{
#pragma db column("OPERATIONALLOG")
std::string OPERATIONALLOG;
#pragma db column("PRINTER")
std::string PRINTER;
#pragma db column("HIGHLIGHTING")
bool HIGHLIGHTING;
#pragma db column("REPORTTYPE")
std::string REPORTTYPE;
};

#endif // COMMON_HXX

station.hxx

#ifndef STATION_HXX
#define STATION_HXX

#include <string>

#include "common.hxx"
#pragma db object table("STATION")
class station
{
public:
station () {}

#pragma db id column("ID")
int ID;
#pragma db column("OPERATINGDOMAIN")
long OPERATINGDOMAIN;
#pragma db column("NAME")
ProcessAggregateName NAME;
#pragma db column("EXPORTBASICDATA")
bool EXPORTBASICDATA;
#pragma db column("EXPORTPROCESSDATA")
bool EXPORTPROCESSDATA;
#pragma db column("IMPORTBASICDATA")
bool IMPORTBASICDATA;
#pragma db column("IMPORTPROCESSDATA")
bool IMPORTPROCESSDATA;
#pragma db column("REPORTING")
Reporting REPORTING;
};

#endif // STATION_HXX

Причина этого: я хочу использовать структуры, объявленные в common.hxx также в других файлах, поэтому я хотел сконцентрировать их в одном и том же заголовочном файле и включать в него везде, где они мне нужны. Моя проблема: если я делаю это таким образом, я получаю ошибки компоновщика, подобные этим:

ошибка LNK2019: неразрешенный внешний символ «public: static void __cdecl
odb :: access :: композитный_значение_traits :: bind (struct odb :: mssql :: bind *, struct
ODB :: доступа :: composite_value_traits :: image_type &, перечисление
ODB :: MSSQL :: statement_kind) «(? привязывать @? $ composite_value_traits @ UProcessAggregateName @@ $ 03 @ доступа @ ODB @@ SAXPAU0mssql @ 3 @ AAUimage_type @ 123 @ W4statement_kind @ 43 @@ Z)
упоминается в функции «public: static void __cdecl
ODB :: доступ :: object_traits_impl :: Bind (структура
odb :: mssql :: bind *, структура odb :: access :: object_traits_impl :: image_type &, enum odb :: mssql :: Statement_kind) «(? bind @? $ object_traits_impl @ Vstation @@ $ 03 @ access @ odb @@ SAXPAU0mssql @ 3 @ AAUimage_type @ 123 @ W4statement_kind @ 43 @@ Z)

ошибка LNK2019: неразрешенный внешний символ «public: static void __cdecl
ODB :: доступа :: composite_value_traits :: Init (структура
ODB :: доступа :: composite_value_traits :: image_type &, struct ProcessAggregateName
Const &, enum odb :: mssql :: Statement_kind) «(? init @? $ композитное_значение @ UProcessAggregateName @@ $ 03 @ access @ odb @@ SAXAAUimage_type @ 123 @ ABUProcessAggregateName @@ W4statement_kind @ mssql @ 3 @@)
упоминается в функции «public: static void __cdecl
ODB :: доступ :: object_traits_impl :: Init (структура
ODB :: доступ :: object_traits_impl :: image_type &,учебный класс
станция конст &, enum odb :: mssql :: Statement_kind) «(? init @? $ object_traits_impl @ Vstation @@ $ 03 @ access @ odb @@ SAXAAUimage_type @ 123 @ ABVstation @@ W4statement_kind @ mssql @ 3 @@ Z)

Если я скопирую декларацию ProcessAggregateName а также Reporting в station.hxx непосредственно вместо common.hxxвсе идет хорошо. Что я делаю неправильно и как я могу объявить часто используемые структуры в одном заголовке и включить его в несколько файлов * .hxx?

0

Решение

odb Компилятор / генератор кода создает три элемента для постоянного уровня — .hxx, .ixx а также .cxx файлы. .hxx а также .ixx файлы содержат объявления типов, которые необходимы для сохранения. Это удовлетворит компилятор при сборке — вы скажете ему, как выглядит интерфейс.

Однако для того, чтобы использовать код, вам нужны файлы реализации (определения). Они присутствуют только в .cxx файлы.

Без .cxx файлы, вы получите odb::access… Ошибки компоновщика; это указывает на то, что код за объявлениями отсутствует.

Как только вы убедитесь, что .cxx файлы скомпилированы и связаны в ваш проект, компиляция должна быть успешной.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]