odb / pgsql / version.hxx нет такого файла или каталога

Я пытаюсь научиться использовать C ++ и ODB, следуя этому руководству:

http://www.codesynthesis.com/products/odb/doc/manual.xhtml#2

Я создал файл Person.hxx, где есть объявление класса Person как постоянный, затем я получил три файла Person-odb: .cxx, .hxx, .ixx

Теперь я должен скомпилировать Person-odb.cxx с

g++ -I/usr/lib/odb/i686-linux-gnu/include Person-odb.cxx

но это заканчивается:

fatal error: odb/pgsql/version.hxx: No such file or directory. compilation terminated.

Я вижу, что есть файл version.hxx, но нет каталога odb / pgsql …
в чем дело?

это Person.hxx, где я определил постоянный класс Person:

#ifndef PERSON_HXX
#define PERSON_HXX

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

using namespace std;#pragma db object
class Person {

private:

Person() {
}

friend class odb::access;#pragma db id auto
unsigned long id_;

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

public:

Person(const std::string& first, const std::string& last,
unsigned short age);

/* getters */
const std::string& first() const;
const std::string& last() const;
unsigned short age() const;
const std::string& email() const;

/* setters */
void setAge(unsigned short);
void setFirst(const std::string&);
void setLast(const std::string&);
void setEmail(const std::string&);

};

#endif

тогда я должен скомпилировать Person.hxx с помощью компилятора odb:

odb -d mysql --generate-query --generate-schema Person.hxx

и я получаю 4 файла Person.odb.hxx, .cxx, .sql, .ixx
это 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;

int main(int argc, char* argv[]) {

try {
auto_ptr<database> db (new odb::mysql::database (argc, argv));

unsigned long marcoID, loryID, lucaID;

/*Create some persistent Person objects */

Person marco ("Marco", "Di Nicola", 26);
Person luca ("Luca", "La Sala", 22);
Person lory ("Lorenzo", "Vinci", 24);

transaction t (db->begin());

marcoID = db->persist(marco);
lucaID = db->persist(luca);
loryID = db->persist(lory);

t.commit();

} catch (const odb::exception& e) {
cerr << e.what() << endl;
return 1;
}
}

и это файл Person-odb.hxx

// This file was generated by ODB, object-relational mapping (ORM)
// compiler for C++.
//

#ifndef PERSON_ODB_HXX
#define PERSON_ODB_HXX

#include <odb/version.hxx>

#if (ODB_VERSION != 20200UL)
#error ODB runtime version mismatch
#endif

#include <odb/pre.hxx>

#include "Person.hxx"
#include <memory>
#include <cstddef>

#include <odb/core.hxx>
#include <odb/traits.hxx>
#include <odb/callback.hxx>
#include <odb/wrapper-traits.hxx>
#include <odb/pointer-traits.hxx>
#include <odb/container-traits.hxx>
#include <odb/no-op-cache-traits.hxx>
#include <odb/result.hxx>
#include <odb/simple-object-result.hxx>

#include <odb/details/unused.hxx>
#include <odb/details/shared-ptr.hxx>

namespace odb
{
// Person

template <>
struct class_traits< ::Person >
{
static const class_kind kind = class_object;
};

template <>
class access::object_traits< ::Person >
{...

#include "Person-odb.ixx"
#include <odb/post.hxx>

#endif // PERSON_ODB_HXX

кажется, все работает нормально, когда я выполняю:

c++ -c Person-odb.cxx
c++ -c driver.cxx

но в конце концов, когда я должен связать все вместе с:

c++ -o driver driver.o Person-odb.o -lodb-mysql -lodb

Я получил:

«неопределенная ссылка на` Person :: Person (std :: basic_string, std :: allocator> const&, std :: basic_string, std :: allocator> const&без знака коротко)

2

Решение

Похоже, ваша проблема в том, что вы не установили ODB. Установка ODB страница должна заставить вас работать.

Вы видите файл version.hxx, но это входной файл для процесса компиляции ODB, а не для включения в ваши программы.

Если вы его установили, выясните, где находится ваша система, и добавьте эту папку в путь компилятора. Ваша команда компиляции становится

g++ -I/usr/lib/odb/i686-linux-gnu/include -I/path/to/odb/install/include Person-odb.cxx

После ваших изменений, я думаю, проблема в том, что вы не ссылаетесь на Person объектный файл, только Person-odb один.

компилировать Person.cxx с

g++ -c Person.cxx

и измените команду связывания на

g++ -o driver driver.o Person.o Person-odb.o -lodb-mysql -lodb

и ошибка должна быть исправлена.

Обратите внимание, что я не знаю ODB. Я пытаюсь понять это с точки зрения чистого C ++.

3

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

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

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