Некоторое время назад встретил на своем пути замечательную ORM-библиотеку ODB. Приглянулась она мне довольно подробными примерами и документацией. А так же мое почтение разработчикам за максимально наглядное изображение, демонстрирующее механизм работы с библиотекой.
Далее я решил применить ее в реальном проекте и столкнулся с парочкой проблем о которых напишу тут.
И так, при использовании библиотеки в чистом С++ проекте проблем возникнуть не должно. В моем случае развлечения начались в процессе прикручивания к проекту с использованием Qt библиотек, в частности при генерации кода для структуры с полем QDateTime для хранения таймстемпов (Это все я делал на Ubuntu). Структура, для которой нужно было сгенерировать код выглядела примерно так.
Окей. В документации указано, что для генерации кода при использовании Qt достаточно использовать опцию —profile qt/date-time. Пытаемся сгенерировать:
И ловим ошибку.
In file included from <odb-prologue-2>:1:
/usr/include/odb/qt/date-time/pgsql/default-mapping.hxx:8:10: fatal error: QtCore/QDate: Нет такого файла или каталога
8 | #include <QtCore/QDate>
| ^~~~~~~~~~~~~~
compilation terminated.
Что не так? Ладно.. Ковыряемся в гугле и пишут, что надо явно указать путь к заголовочным файлам Qt. Указываем.
И ловим огроооомный вывод с ошибками. Он реально огромный и среди большой кучи текста видим, что проскакивают следующие сообщения.
/usr/include/c++/9/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
В usage сообщении odb, помнится мне, я видел, что можно указать стандарт С++. И действительно:
Теперь запускаем с такими опциями.
Ии… Опять ошибка!
/usr/include/x86_64-linux-gnu/qt5/QtCore/qglobal.h:1187:4: error: #error "You must build your code with position independent code if Qt was built with -reduce-relocations. " "Compile your code with -fPIC (-fPIE is not enough)."
1187 | # error "You must build your code with position independent code if Qt was built with -reduce-relocations. "\
Вот на этом моменте я прифигел и потратил несколько часов на гугление, курение документации и танцы с бубном. По итогу выяснилось, что нужно было с помощью опции -x передать параметр -fPIC. Итоговая команда выгоядела так:
И после этого нужные файлы сгенерировались.
SQL-файл используем для создания таблицы в базе.
$ psql --username=ainr --host=localhost --dbname=huidb < player.sql
DROP TABLE
CREATE TABLE
Остальные файлы включаем в Qt/C++ проект. Далее пишем код для вставки данных в таблицу:
Компилируем, запускаем и видим, что данные были адекватно добавлены в базу данных.
Код для получения данных из базы выглядит примерно так:
Вместо вывода
В будущем здесь может появиться описание и решение другой проблемы.