ODB:包含带有通用声明的 *.hxx 文件时出现未解析的外部符号错误
ODB: unresolved external symbol error when including *.hxx file with common declarations
我必须在我的项目中使用 ODB framework。我有 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
中声明的结构,所以我想将它们集中在同一个 header 文件中,并在我需要它们的任何地方包含它。我的问题:如果我这样做,我会收到如下链接器错误:
error LNK2019: unresolved external symbol "public: static void __cdecl
odb::access::composite_value_traits::bind(struct odb::mssql::bind *,struct
odb::access::composite_value_traits::image_type &,enum
odb::mssql::statement_kind)"
(?bind@?$composite_value_traits@UProcessAggregateName@@@access@odb@@SAXPAU0mssql@3@AAUimage_type@123@W4statement_kind@43@@Z)
referenced in function "public: static void __cdecl
odb::access::object_traits_impl::bind(struct
odb::mssql::bind *,struct odb::access::object_traits_impl::image_type &,enum odb::mssql::statement_kind)"
(?bind@?$object_traits_impl@Vstation@@@access@odb@@SAXPAU0mssql@3@AAUimage_type@123@W4statement_kind@43@@Z)
error LNK2019: unresolved external symbol "public: static void __cdecl
odb::access::composite_value_traits::init(struct
odb::access::composite_value_traits::image_type &,struct ProcessAggregateName
const &,enum odb::mssql::statement_kind)"
(?init@?$composite_value_traits@UProcessAggregateName@@@access@odb@@SAXAAUimage_type@123@ABUProcessAggregateName@@W4statement_kind@mssql@3@@Z)
referenced in function "public: static void __cdecl
odb::access::object_traits_impl::init(struct
odb::access::object_traits_impl::image_type &,class
station const &,enum odb::mssql::statement_kind)"
(?init@?$object_traits_impl@Vstation@@@access@odb@@SAXAAUimage_type@123@ABVstation@@W4statement_kind@mssql@3@@Z)
如果我将 ProcessAggregateName
和 Reporting
的声明直接复制到 station.hxx
中,而不是包含 common.hxx
,一切都会正常进行。我做错了什么以及如何在单个 header 中声明常用结构并将其包含在多个 *.hxx 文件中?
odb
compiler/code 生成器为持久层创建三个元素 - .hxx
、.ixx
和 .cxx
文件。 .hxx
和 .ixx
文件包含执行持久性所需的类型的声明。这些将在构建时满足编译器 - 你告诉它界面是什么样的。
但是,为了使用代码,您需要实现文件(定义)。这些仅存在于 .cxx
文件中。
如果没有 .cxx
文件,您会得到 odb::access
… 链接器错误;这些表明声明背后的代码丢失了。
一旦您确保 .cxx
文件已编译并链接到您的项目中,编译应该会成功。
我必须在我的项目中使用 ODB framework。我有 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
中声明的结构,所以我想将它们集中在同一个 header 文件中,并在我需要它们的任何地方包含它。我的问题:如果我这样做,我会收到如下链接器错误:
error LNK2019: unresolved external symbol "public: static void __cdecl odb::access::composite_value_traits::bind(struct odb::mssql::bind *,struct odb::access::composite_value_traits::image_type &,enum odb::mssql::statement_kind)" (?bind@?$composite_value_traits@UProcessAggregateName@@@access@odb@@SAXPAU0mssql@3@AAUimage_type@123@W4statement_kind@43@@Z) referenced in function "public: static void __cdecl odb::access::object_traits_impl::bind(struct odb::mssql::bind *,struct odb::access::object_traits_impl::image_type &,enum odb::mssql::statement_kind)" (?bind@?$object_traits_impl@Vstation@@@access@odb@@SAXPAU0mssql@3@AAUimage_type@123@W4statement_kind@43@@Z)
error LNK2019: unresolved external symbol "public: static void __cdecl odb::access::composite_value_traits::init(struct odb::access::composite_value_traits::image_type &,struct ProcessAggregateName const &,enum odb::mssql::statement_kind)" (?init@?$composite_value_traits@UProcessAggregateName@@@access@odb@@SAXAAUimage_type@123@ABUProcessAggregateName@@W4statement_kind@mssql@3@@Z) referenced in function "public: static void __cdecl odb::access::object_traits_impl::init(struct odb::access::object_traits_impl::image_type &,class station const &,enum odb::mssql::statement_kind)" (?init@?$object_traits_impl@Vstation@@@access@odb@@SAXAAUimage_type@123@ABVstation@@W4statement_kind@mssql@3@@Z)
如果我将 ProcessAggregateName
和 Reporting
的声明直接复制到 station.hxx
中,而不是包含 common.hxx
,一切都会正常进行。我做错了什么以及如何在单个 header 中声明常用结构并将其包含在多个 *.hxx 文件中?
odb
compiler/code 生成器为持久层创建三个元素 - .hxx
、.ixx
和 .cxx
文件。 .hxx
和 .ixx
文件包含执行持久性所需的类型的声明。这些将在构建时满足编译器 - 你告诉它界面是什么样的。
但是,为了使用代码,您需要实现文件(定义)。这些仅存在于 .cxx
文件中。
如果没有 .cxx
文件,您会得到 odb::access
… 链接器错误;这些表明声明背后的代码丢失了。
一旦您确保 .cxx
文件已编译并链接到您的项目中,编译应该会成功。