Qt5 сборка плагина QIBASE - Ubuntu 16.04

Тип статьи:
Авторская

Решение https://ru.stackoverflow.com/questions/602903/qt-5-7-Компиляция-ibase-плагина-в-ubuntu-16-10/660797#660797

Мои действия:

sudo apt-get install firebird-dev

sudo ln -s /usr/lib/i386-linux-gnu/libfbclient.so.2.5.6 /usr/lib/libfbclient.so
sudo ln -s /usr/lib/i386-linux-gnu/libfbclient.so.2.5.6 /usr/lib/libgds.so
sudo ln -s /usr/lib/libfbclient.so /usr/lib/libgds.so.0

~/Qt/5.7/Src/qtbase/src/plugins/sqldrivers/ibase$ qmake «INCLUDEPATH+=/usr/include/firebird» «LIBS+=-L/usr/lib64 -lfbclient» ibase.pro

~/Qt/5.7/Src/qtbase/src/plugins/sqldrivers/ibase$ make -j3
g++ -c -g -O2 -fdebug-prefix-map=/build/qtbase-opensource-src-B0ETYQ/qtbase-opensource-src-5.6.1+dfsg=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -O2 -std=c++1z -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -Wall -W -Wvla -Wdate-time -D_REENTRANT -fPIC -DQT_NO_TSLIB -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -I. -isystem /usr/include/firebird -isystem /usr/include/x86_64-linux-gnu/qt5/QtSql/5.6.1 -isystem /usr/include/x86_64-linux-gnu/qt5/QtSql/5.6.1/QtSql -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore/5.6.1 -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore/5.6.1/QtCore -isystem /usr/include/x86_64-linux-gnu/qt5 -isystem /usr/include/x86_64-linux-gnu/qt5/QtSql -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore -I.moc -I../../../../mkspecs/linux-g++-64 -o .obj/qsql_ibase.o ../../../sql/drivers/ibase/qsql_ibase.cpp
../../../sql/drivers/ibase/qsql_ibase.cpp:371:35: error: invalid use of incomplete type ‘class QSqlCachedResultPrivate’
class QIBaseResultPrivate: public QSqlCachedResultPrivate
^~~~~~~~~~~~~~~~~~~~~~~
In file included from ../../../sql/drivers/ibase/qsql_ibase.cpp:48:0:
/usr/include/x86_64-linux-gnu/qt5/QtSql/5.6.1/QtSql/private/qsqlcachedresult_p.h:55:7: note: forward declaration of ‘class QSqlCachedResultPrivate’
class QSqlCachedResultPrivate;
^~~~~~~~~~~~~~~~~~~~~~~
../../../sql/drivers/ibase/qsql_ibase.cpp:376:45: error: ISO C++ forbids declaration of ‘Q_DECLARE_SQLDRIVER_PRIVATE’ with no type [-fpermissive]
Q_DECLARE_SQLDRIVER_PRIVATE(QIBaseDriver)
^
../../../sql/drivers/ibase/qsql_ibase.cpp:376:45: error: expected ‘;’ at end of member declaration
In file included from /usr/include/x86_64-linux-gnu/qt5/QtCore/qnamespace.h:37:0,
from /usr/include/x86_64-linux-gnu/qt5/QtCore/qobjectdefs.h:41,
from /usr/include/x86_64-linux-gnu/qt5/QtCore/qobject.h:40,
from /usr/include/x86_64-linux-gnu/qt5/QtSql/qsqldriver.h:37,
from ../../../sql/drivers/ibase/qsql_ibase_p.h:54,
from ../../../sql/drivers/ibase/qsql_ibase.cpp:40:
../../../sql/drivers/ibase/qsql_ibase.cpp: In member function ‘QIBaseResult* QIBaseResultPrivate::q_func()’:
../../../sql/drivers/ibase/qsql_ibase.cpp:373:5: error: ‘q_ptr’ was not declared in this scope
Q_DECLARE_PUBLIC(QIBaseResult)
^
../../../sql/drivers/ibase/qsql_ibase.cpp: In member function ‘const QIBaseResult* QIBaseResultPrivate::q_func() const’:
../../../sql/drivers/ibase/qsql_ibase.cpp:373:5: error: ‘q_ptr’ was not declared in this scope
Q_DECLARE_PUBLIC(QIBaseResult)
^
../../../sql/drivers/ibase/qsql_ibase.cpp: In constructor ‘QIBaseResultPrivate::QIBaseResultPrivate(QIBaseResult*, const QIBaseDriver*)’:
../../../sql/drivers/ibase/qsql_ibase.cpp:419:7: error: type ‘QSqlCachedResultPrivate’ is not a direct base of ‘QIBaseResultPrivate’
: QSqlCachedResultPrivate(q, drv),
^~~~~~~~~~~~~~~~~~~~~~~
../../../sql/drivers/ibase/qsql_ibase.cpp:421:36: error: ‘drv_d_func’ was not declared in this scope
localTransaction(!drv_d_func()->ibase),
^
../../../sql/drivers/ibase/qsql_ibase.cpp: In member function ‘bool QIBaseResultPrivate::transaction()’:
../../../sql/drivers/ibase/qsql_ibase.cpp:871:20: error: ‘drv_d_func’ was not declared in this scope
if (drv_d_func()->trans) {
^
../../../sql/drivers/ibase/qsql_ibase.cpp: In constructor ‘QIBaseResult::QIBaseResult(const QIBaseDriver*)’:
../../../sql/drivers/ibase/qsql_ibase.cpp:905:58: error: no matching function for call to ‘QSqlCachedResult::QSqlCachedResult(QIBaseResultPrivate&)’
: QSqlCachedResult(*new QIBaseResultPrivate(this, db))
^
In file included from ../../../sql/drivers/ibase/qsql_ibase.cpp:48:0:
/usr/include/x86_64-linux-gnu/qt5/QtSql/5.6.1/QtSql/private/qsqlcachedresult_p.h:65:5: note: candidate: QSqlCachedResult::QSqlCachedResult(const QSqlDriver*)
QSqlCachedResult(const QSqlDriver * db);
^~~~~~~~~~~~~~~~
/usr/include/x86_64-linux-gnu/qt5/QtSql/5.6.1/QtSql/private/qsqlcachedresult_p.h:65:5: note: no known conversion for argument 1 from ‘QIBaseResultPrivate’ to ‘const QSqlDriver*’
Makefile:434: ошибка выполнения рецепта для цели «.obj/qsql_ibase.o»
make: *** [.obj/qsql_ibase.o] Ошибка 1

UPD 1:

установил firebird2.5-dev

sudo apt-get install firebird2.5 Чтение списков пакетов… Готово Построение дерева зависимостей Чтение информации о состоянии… Готово Заметьте, выбирается «firebird2.5-classic» для regex «firebird2.5» Заметьте, выбирается «firebird2.5-dev» для regex «firebird2.5» Заметьте, выбирается «firebird2.5-doc» для regex «firebird2.5» Заметьте, выбирается «firebird2.5-common» для regex «firebird2.5» Заметьте, выбирается «firebird2.5-common-doc» для regex «firebird2.5» Заметьте, выбирается «firebird2.5-super» для regex «firebird2.5» Заметьте, выбирается «firebird2.5-server-common» для regex «firebird2.5» Заметьте, выбирается «firebird2.5-examples» для regex «firebird2.5» Заметьте, выбирается «firebird2.5-classic-common» для regex «firebird2.5» Заметьте, выбирается «firebird2.5-superclassic» для regex «firebird2.5» Заметьте, вместо «firebird2.5-dev» выбирается «firebird-dev» Уже установлен пакет firebird-dev самой новой версии (2.5.6.27020.ds4-2). Уже установлен пакет firebird2.5-common самой новой версии (2.5.6.27020.ds4-2). firebird2.5-common установлен вручную. Уже установлен пакет firebird2.5-common-doc самой новой версии (2.5.6.27020.ds4-2). firebird2.5-common-doc установлен вручную. Уже установлен пакет firebird2.5-server-common самой новой версии (2.5.6.27020.ds4-2). firebird2.5-server-common установлен вручную. Уже установлен пакет firebird2.5-super самой новой версии (2.5.6.27020.ds4-2). Некоторые пакеты невозможно установить. Возможно, вы просите невозможного, или же используете нестабильную версию дистрибутива, где запрошенные вами пакеты ещё не созданы или были удалены из Incoming. Следующая информация, возможно, поможет вам:

Пакеты, имеющие неудовлетворённые зависимости: firebird2.5-classic: Конфликтует: firebird-server firebird2.5-classic-common: Конфликтует: firebird-udf
Конфликтует: firebird-utils firebird2.5-super: Конфликтует: firebird-server
Конфликтует: firebird-udf
Конфликтует: firebird-utils firebird2.5-superclassic: Конфликтует: firebird-server
Исправил. Компилю в версии 5.2.1. Теперь имеется следующая ошибка:

../../../sql/drivers/ibase/qsql_ibase.cpp: In constructor ‘QIBaseDriverPrivate::QIBaseDriverPrivate()’:
../../../sql/drivers/ibase/qsql_ibase.cpp:317:89: error: ‘Interbase’ was not declared in this scope
ate(): QSqlDriverPrivate(), ibase(0), trans(0), tc(0) { dbmsType = Interbase; }
^~~~~~~~~
Makefile:423: ошибка выполнения рецепта для цели «.obj/qsql_ibase.o»
make: *** [.obj/qsql_ibase.o] Ошибка 1
ни чего не меняя для компиляции версии 5.5 (см решение для windows)
../../../sql/drivers/ibase/qsql_ibase.cpp:74: error: undefined reference to 'isc_sqlcode'
../../../sql/drivers/ibase/qsql_ibase.cpp:77: error: undefined reference to 'fb_interpret'
../../../sql/drivers/ibase/qsql_ibase.cpp:882: error: undefined reference to 'isc_commit_transaction'
../../../sql/drivers/ibase/qsql_ibase.cpp:1337: error: undefined reference to 'isc_dsql_sql_info'
../../../sql/drivers/ibase/qsql_ibase.cpp:1343: error: undefined reference to 'isc_vax_integer'
../../../sql/drivers/ibase/qsql_ibase.cpp:1345: error: undefined reference to 'isc_vax_integer'
../../../sql/drivers/ibase/qsql_ibase.cpp:426: error: undefined reference to 'isc_dsql_free_statement'
../../../sql/drivers/ibase/qsql_ibase.cpp:441: error: undefined reference to 'isc_create_blob2'
../../../sql/drivers/ibase/qsql_ibase.cpp:447: error: undefined reference to 'isc_put_segment'
../../../sql/drivers/ibase/qsql_ibase.cpp:453: error: undefined reference to 'isc_close_blob'
../../../sql/drivers/ibase/qsql_ibase.cpp:461: error: undefined reference to 'isc_open_blob2'
../../../sql/drivers/ibase/qsql_ibase.cpp:471: error: undefined reference to 'isc_get_segment'
../../../sql/drivers/ibase/qsql_ibase.cpp:482: error: undefined reference to 'isc_close_blob'
../../../sql/drivers/ibase/qsql_ibase.cpp:482: error: undefined reference to 'isc_close_blob'
../../../sql/drivers/ibase/qsql_ibase.cpp:844: error: undefined reference to 'isc_dsql_sql_info'
../../../sql/drivers/ibase/qsql_ibase.cpp:848: error: undefined reference to 'isc_vax_integer'
../../../sql/drivers/ibase/qsql_ibase.cpp:849: error: undefined reference to 'isc_vax_integer'
../../../sql/drivers/ibase/qsql_ibase.cpp:864: error: undefined reference to 'isc_start_transaction'
../../../sql/drivers/ibase/qsql_ibase.cpp:925: error: undefined reference to 'isc_dsql_allocate_statement'
../../../sql/drivers/ibase/qsql_ibase.cpp:930: error: undefined reference to 'isc_dsql_prepare'
../../../sql/drivers/ibase/qsql_ibase.cpp:935: error: undefined reference to 'isc_dsql_describe_bind'
../../../sql/drivers/ibase/qsql_ibase.cpp:946: error: undefined reference to 'isc_dsql_describe_bind'
../../../sql/drivers/ibase/qsql_ibase.cpp:960: error: undefined reference to 'isc_dsql_describe'
../../../sql/drivers/ibase/qsql_ibase.cpp:1583: error: undefined reference to 'isc_start_transaction'
../../../sql/drivers/ibase/qsql_ibase.cpp:1596: error: undefined reference to 'isc_commit_transaction'
../../../sql/drivers/ibase/qsql_ibase.cpp:1610: error: undefined reference to 'isc_rollback_transaction'
../../../sql/drivers/ibase/qsql_ibase.cpp:1891: error: undefined reference to 'isc_event_counts'
../../../sql/drivers/ibase/qsql_ibase.cpp:1912: error: undefined reference to 'isc_que_events'
../../../sql/drivers/ibase/qsql_ibase.cpp:1526: error: undefined reference to 'isc_attach_database'
../../../sql/drivers/ibase/qsql_ibase.cpp:789: error: undefined reference to 'isc_array_lookup_bounds'
../../../sql/drivers/ibase/qsql_ibase.cpp:835: error: undefined reference to 'isc_array_put_slice'
../../../sql/drivers/ibase/qsql_ibase.cpp:602: error: undefined reference to 'isc_array_lookup_bounds'
../../../sql/drivers/ibase/qsql_ibase.cpp:634: error: undefined reference to 'isc_array_get_slice'
../../../sql/drivers/ibase/qsql_ibase.cpp:1549: error: undefined reference to 'isc_cancel_events'
../../../sql/drivers/ibase/qsql_ibase.cpp:1563: error: undefined reference to 'isc_detach_database'
../../../sql/drivers/ibase/qsql_ibase.cpp:1079: error: undefined reference to 'isc_dsql_free_statement'
../../../sql/drivers/ibase/qsql_ibase.cpp:1087: error: undefined reference to 'isc_dsql_execute'
../../../sql/drivers/ibase/qsql_ibase.cpp:1085: error: undefined reference to 'isc_dsql_execute2'
../../../sql/drivers/ibase/qsql_ibase.cpp:1126: error: undefined reference to 'isc_dsql_fetch'
../../../sql/drivers/ibase/qsql_ibase.cpp:1810: error: undefined reference to 'isc_event_block'
../../../sql/drivers/ibase/qsql_ibase.cpp:1832: error: undefined reference to 'isc_que_events'
../../../sql/drivers/ibase/qsql_ibase.cpp:1861: error: undefined reference to 'isc_cancel_events'
collect2: error: ld returned 1 exit status
Makefile:112: ошибка выполнения рецепта для цели «../../../../plugins/sqldrivers/libqsqlibase.»
make: *** [../../../../plugins/sqldrivers/libqsqlibase.] Ошибка 1

UPD: 2 взято здесь. результат тот же

sudo ln /usr/lib/libfbclient.so /usr/lib/lgds.so
sudo ln /usr/lib/libfbclient.so /usr/lib/libgds.so
qmake «INCLUDEPATH+=/opt/firebird/include» «INCLUDEPATH+=/usr/lib/x86_64-linux-gnu/» «LIBS+=-L/usr/lib/x86_64-linux-gnu/libfbclient.so» «LIBS+=-L/usr/lib/lgds.so» «LIBS+=-L/usr/lib/x86_64-linux-gnu/libdl.so» «LIBS+=-L/usr/lib/libgds.so» ibase.pro


dpkg --get-selections | grep firebird
firebird-dev install
firebird2.5-classic deinstall
firebird2.5-common install
firebird2.5-common-doc install
firebird2.5-server-common install
firebird2.5-super install
libreoffice-sdbc-firebird install

gbak -z
gbak:gbak version LI-V2.5.6.27020 Firebird 2.5
gbak: ERROR:requires both input and output filenames
gbak:Exiting before completion due to errors
UPD 3:

$ dpkg -L firebird2.5-super
/.
/etc
/etc/init.d
/etc/init.d/firebird2.5-super
/usr
/usr/bin
/usr/bin/fbstat
/usr/bin/fbsvcmgr
/usr/bin/fbtracemgr
/usr/bin/gbak
/usr/bin/gdef
/usr/bin/gfix
/usr/bin/gpre
/usr/bin/gsec
/usr/bin/isql-fb
/usr/bin/nbackup
/usr/bin/qli
/usr/lib
/usr/lib/firebird
/usr/lib/firebird/2.5
/usr/lib/firebird/2.5/UDF
/usr/lib/firebird/2.5/UDF/fbudf.so
/usr/lib/firebird/2.5/UDF/ib_udf.so
/usr/sbin
/usr/sbin/fb_lock_print
/usr/sbin/fbserver
/usr/share
/usr/share/doc
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/firebird2.5-super
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/fbserver.1.gz
/usr/share/doc/firebird2.5-super
поменял:

$ qmake «INCLUDEPATH+=/usr/bin/» «INCLUDEPATH+=/usr/lib/x86_64-linux-gnu/» «LIBS+=-L/usr/lib/x86_64-linux-gnu/libfbclient.so» «LIBS+=-L/usr/lib/lgds.so» «LIBS+=-L/usr/lib/x86_64-linux-gnu/libdl.so» «LIBS+=-L/usr/lib/libgds.so» ibase.pro
$ sudo cp /usr/lib/x86_64-linux-gnu/firebird/2.5/firebird.msg /opt/firebird/firebird.msg
создал переменную окружения:

sudo nano /etc/profile
export FIREBIRD="/opt/firebird"
UPD 4:

при одинаковых настройках:

make

лог ошибок №4 для Qt 5.2.1 — 5.3

лог ошибок №3 для Qt 5.4-5.5

лог ошибок №1 для Qt 5.6

лог ошибок №2 для Qt 5.7

UPD 5:

sudo gedit /usr/include/c++/6/cstdlib
заменил stdlib.h на /usr/include/stdlib.h
переустановил firebird-dev на 2.5.6.27020.ds4-2 скачав с сайта

http://packages.ubuntu.com/yakkety/firebird-dev

использую:


qmake «INCLUDEPATH+=/usr/bin/» «INCLUDEPATH+=/usr/lib/x86_64-linux-gnu/» «LIBS+=-L/usr/lib/x86_64-linux-gnu/libfbclient.so» «LIBS+=-L/usr/lib/lgds.so» «LIBS+=-L/usr/lib/x86_64-linux-gnu/libdl.so» «LIBS+=-L/usr/lib/libgds.so» «INCLUDEPATH+=/usr/lib/x86_64-linux-gnu/firebird/2.5/» «LIBS+=-L/usr/lib64 -lfbclient» «INCLUDEPATH+=/usr/include/» ibase.pro
UPD 6:

:~/Qt/5.7/Src/qtbase/src/plugins/sqldrivers/ibase$ gedit ../../../sql/drivers/ibase/qsql_ibase.cpp
текст

#include <QtSql/private/qsqlcachedresult_p.h> заменил на
#include </usr/local/Qt-5.7.0/include/QtSql/5.7.0/QtSql/private/qsqlcachedresult_p.h>
заменил подключение библиотеки на прямое указание файла, количество ошибок значительно снизилось в 5.7

../../../sql/drivers/ibase/qsql_ibase.cpp:376:45: error: ISO C++ forbids declaration of ‘Q_DECLARE_SQLDRIVER_PRIVATE’ with no type [-fpermissive]
Q_DECLARE_SQLDRIVER_PRIVATE(QIBaseDriver)
^
../../../sql/drivers/ibase/qsql_ibase.cpp:376:45: error: expected ‘;’ at end of member declaration
../../../sql/drivers/ibase/qsql_ibase.cpp: In constructor ‘QIBaseResultPrivate::QIBaseResultPrivate(QIBaseResult*, const QIBaseDriver*)’:
../../../sql/drivers/ibase/qsql_ibase.cpp:421:36: error: ‘drv_d_func’ was not declared in this scope
localTransaction(!drv_d_func()->ibase),
^
../../../sql/drivers/ibase/qsql_ibase.cpp: In member function ‘bool QIBaseResultPrivate::transaction()’:
../../../sql/drivers/ibase/qsql_ibase.cpp:871:20: error: ‘drv_d_func’ was not declared in this scope
if (drv_d_func()->trans) {
^
Makefile:434: ошибка выполнения рецепта для цели «.obj/qsql_ibase.o»
make: *** [.obj/qsql_ibase.o] Ошибка 1
UPD 7:

sudo rm /usr/lib/libfbclient.so
sudo rm /usr/lib/libgds.so
sudo rm /usr/lib/lgds.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libfbclient.so.2.5.6 /usr/lib/libfbclient.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libfbclient.so.2.5.6 /usr/lib/libgds.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libfbclient.so.2.5.6 /usr/lib/lgds.so
замена соответвующего include для 5.3 и 5.6 на путь

/usr/include/x86_64-linux-gnu/qt5/QtSql/5.6.1/QtSql/private/qsqlcachedresult_p.h
в итоге для 5.6 получилось исправить ошибку:

/usr/bin/ld.gold: error: невозможно открыть /usr/lib/gcc/x86_64-linux-gnu/6/../../../../lib/libgds.so: Нет такого файла или каталога
430

Комментарии

Нет комментариев. Ваш будет первым!