C++ odb“;“你好,世界”;链接结果为;“未定义引用”;

C++ odb“;“你好,世界”;链接结果为;“未定义引用”;,c++,odb,C++,Odb,我试图编译odb附带的“Hello World”示例。我正在使用DebianLinux 我复制了person.hxx和driver.cxx文件 // person.hxx #ifndef person_hxx #define person_hxx #include <string> #include <odb/core.hxx> #pragma db object class person { public: person (const std::string&a

我试图编译odb附带的“Hello World”示例。我正在使用DebianLinux

我复制了person.hxx和driver.cxx文件

// person.hxx
#ifndef person_hxx
#define person_hxx

#include <string>
#include <odb/core.hxx>

#pragma db object
class person
{
public:
  person (const std::string& first,
          const std::string& last,
          unsigned short age);

  const std::string& first () const;
  const std::string& last () const;

  unsigned short age () const;
  void age (unsigned short);

private:
  person () {}

  friend class odb::access;

  #pragma db id auto
  unsigned long id_;

  std::string first_;
  std::string last_;
  unsigned short age_;
};

#endif


// driver.cxx

#include <memory>
#include <iostream>

#include <odb/database.hxx>
#include <odb/transaction.hxx>

#include <odb/mysql/database.hxx>

#include "person.hxx"
#include "person-odb.hxx"

using namespace std;
using namespace odb::core;

int main (int argc, char * argv[])
{
  try
    {
      auto_ptr<database> db (new odb::mysql::database (argc, argv));

      unsigned long john_id,jane_id, joe_id;
      {
        person john("John","Doe", 33);
    person jane ("Jane","Doe", 32);
        person joe("Joe","Dirt",30);

    transaction t (db -> begin());

        john_id = db->persist(john);
        jane_id = db->persist(jane);
        joe_id = db->persist(joe);

        t.commit();
      }
    }
  catch (const odb::exception& e)
    {
      cerr << e.what() <<endl;
      return 1;
    }
}
一切都很顺利

问题始于链路阶段

g++  driver.o  person-odb.o -lodb-mysql -lodb -o driver
重新融入

driver.cxx:(.text+0x14d): undefined reference to `person::person(std::string const&, std::string const&, unsigned short)'

您需要添加构造函数的实现。例如:

person (const std::string& first,
      const std::string& last,
      unsigned short age){}

几年后,如果您复制并粘贴odb网站中给出的分步示例,您仍然会遇到问题。person.hxx文件中缺少实现

替换以下内容:

  person (const std::string& first,
          const std::string& last,
          unsigned short age);
为此:

  person (const std::string& first,
          const std::string& last,
          unsigned short age) :
      first_(first),
      last_(last),
      age_(age)
  {
  }
此外,在driver.cxx中,您可以将
自动\u ptr
替换为
唯一的\u ptr
,或通过以下方式编译:

g++ -g -std=c++98 -o driver driver.cxx person-odb.cxx -lodb-mysql -lodb

您可以从以下位置下载工作示例:

您要么不编译并链接
person.cpp
,要么不定义构造函数
person::person
。链接器找不到构造函数的目标代码。person-odb.cxx在哪里?给我们看看。链接器抱怨它不包含构造函数的代码。该示例没有person.cpp文件,只有一个名为“person odb.cpp”的文件,它是由编写person.hxx的odb编译器自动生成的,同一个人需要编写person.cxy您需要运行
odb
编译器来生成
person odb.cxx
文件。此文件需要编译并与其他文件链接。
g++ -g -std=c++98 -o driver driver.cxx person-odb.cxx -lodb-mysql -lodb