Я должен использовать Рамки 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?
odb
Компилятор / генератор кода создает три элемента для постоянного уровня — .hxx
, .ixx
а также .cxx
файлы. .hxx
а также .ixx
файлы содержат объявления типов, которые необходимы для сохранения. Это удовлетворит компилятор при сборке — вы скажете ему, как выглядит интерфейс.
Однако для того, чтобы использовать код, вам нужны файлы реализации (определения). Они присутствуют только в .cxx
файлы.
Без .cxx
файлы, вы получите odb::access
… Ошибки компоновщика; это указывает на то, что код за объявлениями отсутствует.
Как только вы убедитесь, что .cxx
файлы скомпилированы и связаны в ваш проект, компиляция должна быть успешной.
Других решений пока нет …