odb & quot; Hello World & quot; ссылка приводит к & quot; неопределенной ссылке & quot;

Я пытаюсь скомпилировать пример «Hello World», который поставляется с odb. Я использую Debian Linux.

Я скопировал файлы 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;
}
}

Компилятор driverthe odb работал нормально и создавал файлы person-odb.

Я собрал их с

g++ -c deiver.cxx
g++ -c person-odb.cxx

и все прошло хорошо.

Проблема началась с фазы соединения

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)'

0

Решение

Вам нужно добавить реализацию конструктора. Пример:

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

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

Через пару лет у вас могут возникнуть проблемы, если вы скопируете и вставите пошаговый пример, приведенный на сайте 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 вы можете заменить auto_ptr с unique_ptr или скомпилировать так:

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

Вы можете скачать рабочие примеры с: https://www.codesynthesis.com/products/odb/download.xhtml

0

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