Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Qt(static) +sqlite + sqlcipher как подключить


Автор: dream2work 5.4.2012, 16:07
Здравствуйте.

QT 4.8 у меня собрано статически. Linux.
Собирал sqlcipher как пишет здесь http://wiki.crossplatform.ru/index.php/%D0%9F%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0_SQLCipher_%D0%BA_Qt
только с поправкой на статическую сборку.

В конце сборки В каталоге /usr/local/Trolltech/Qt-4.8.0/plugins/sqldrivers у меня появились 'libqsqlcipher.a' 'libqsqlcipher.prl'
Насколько я понял libqsqlcipher.a - как раз предназначен для статической линковки.
Дальше в my_project.pro добавляю библиотеку

Код

QTPLUGIN += qsqlcipher
LIBS += -L/usr/local/Trolltech/Qt-4.8.0/plugins/sqldrivers/ -lqsqlcipher
INCLUDEPATH += /usr/local/Trolltech/Qt-4.8.0/plugins/sqldrivers
DEPENDPATH += /usr/local/Trolltech/Qt-4.8.0/plugins/sqldrivers
PRE_TARGETDEPS += /usr/local/Trolltech/Qt-4.8.0/plugins/sqldrivers/libqsqlcipher.a

В main.cpp добавляю
Код

#include <QPlugin>
QT_BEGIN_NAMESPACE
Q_IMPORT_PLUGIN(qsqlcipher)
QT_END_NAMESPACE

Теперь при билде падает ошЬІбка:
Код

/home/admin/Documents/my_project/src/main.o:-1: In function `global constructors keyed to _Z16myMessageHandler9QtMsgTypePKc':
/home/admin/Documents/my_project/src/main.cpp:-1: error: undefined reference to `qt_plugin_instance_qsqlcipher()'


Буду рад если кто-то это проходил и отпишется.
Спасибо.

Автор: dream2work 5.4.2012, 16:28
nm libqsqlcipher.a | grep qt_plugin_instance_qsqlcipher -  ничего не находит 
а nm libqsqlcipher.a | grep qt_plugin_instance

Код

0000000000000180 T _Z26qt_plugin_instance_qsqlitev
0000000000000240 T _Z41qt_plugin_instance_QSQLCipherDriverPluginv
0000000000000000 b _ZGVZ26qt_plugin_instance_qsqlitevE9_instance
0000000000000010 b _ZGVZ41qt_plugin_instance_QSQLCipherDriverPluginvE9_instance
0000000000000008 b _ZZ26qt_plugin_instance_qsqlitevE9_instance
0000000000000018 b _ZZ41qt_plugin_instance_QSQLCipherDriverPluginvE9_instance


Автор: dream2work 6.4.2012, 12:43
Собрал. Была в файле cmain.cpp ошибка.
Теперь другая проблема - база не шифруется.
Создаю базу и первым делом выполняю скрипт
Код

"pragma key = '12345';"

Но база не шифруется.
Кто-то сталкивался  с такой проблемой?

Автор: dream2work 20.4.2012, 09:53
Уф. Разобрался. Тепер все работает. 
Кому интересно собираем все как пишет здесь http://wiki.crossplatform.ru/index.php/%D0%9F%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0_SQLCipher_%D0%BA_Qt
но с некоторым отличием. У меня плагин sqlcipher находится в /home/administrator/Downloads/qt-everywhere-opensource-src-4.8.0/src/plugins/sqldrivers/sqlcipher/
1. Сборка sqlite командой
 
Код

./configure --prefix=/home/administrator/Downloads/qt-everywhere-opensource-src-4.8.0/src/plugins/sqldrivers/sqlcipher --disable-shared --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto"

2. sqlcipher.pro - имеет следующий вид для статической сборки
Код

TARGET   = qsqlcipher
CONFIG  += static
HEADERS  = ../../../sql/drivers/sqlite/qsql_sqlite.h
SOURCES  = smain.cpp \
           ../../../sql/drivers/sqlite/qsql_sqlite.cpp

DEFINES     += SQLITE_OMIT_LOAD_EXTENSION SQLITE_OMIT_COMPLETE SQLITE_HAS_CODEC
LIBS        += -Llib -L/home/admin/Downloads/qt-everywhere-opensource-src-4.8.0/src/plugins/sqldrivers/sqlcipher/lib/ -lsqlite3
INCLUDEPATH += /home/admin/Downloads/qt-everywhere-opensource-src-4.8.0/src/plugins/sqldrivers/sqlcipher/include
QMAKE_RPATHDIR += lib
 include(../qsqldriverbase.pri)

4. В проекте где хотим использовать sqlcipher добавляем в *.pro файл
Код

QTPLUGIN += qsqlcipher
LIBS += -lcrypto

Теперь наш проект зависит только от библиотеки libcrypto. В убунту она находится в пакете - libssl.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)