Qt5.5.1 使用ODB
環境
系統:Windows 10 64bit
數據庫:SQLite3
Qt:Qt5.5.1(msvc2010)
Visual Studio:vs2010
ODB相關庫版本:2.4.0
下載和編譯
SQLite
參考上文編譯。但是,ODB中用到了sqlite中的sqlite3_unlock_notify()函數,需要多做以下兩步:
- 在”項目屬性”-“配置屬性”-“預處理器”-“預處理器定義”中添加一個宏:
SQLITE_ENABLE_UNLOCK_NOTIFY
- 在sqlite3.def文件最後添加一句:
sqlite3_unlock_notify
ODB
請參考:http://blog.csdn.net/calmreason/article/details/49492151
下載
從官網下載頁面下載5個壓縮文件:
- ODB編譯器
- ODB主運行時庫
- ODB數據庫運行時庫
- ODB-Qt擴展運行時庫
- 代碼樣例
編譯libodb和libodb-sqlite
請參考上文依次進行編譯。
編譯libodb-qt
與編譯libodb-sqlite過程一樣。需要將libodb的頭文件、sqlite3的頭文件,以及.lib文件拷貝到libodb-qt項目下進行編譯。
在Qt Creator中使用ODB
創建工程
簡單起見,我將直接編譯和運行ODB提供的Qt Demo,Demo程序路徑在odb-examples-2.4.0\qt
路徑下。
- 在Qt Creator中新建一個工程,將Demo程序中的employee.h和driver.cpp文件拷貝到Qt的工程目錄下,並添加到項目中。
- 在工程目錄下新建include文件夾,將libodb、libodb-sqlite、libodb-qt三個項目的頭文件全部拷貝進
include/odb/
目錄,講sqlite3.h拷貝到include/
目錄。 - 在工程目錄下新建lib文件夾,將sqlite3、libodb、libodb-sqlite和libodb-qt四個項目中編譯出來的.lib文件全部拷貝進來。
- 修改項目的.pro文件,添加上面創建的引用目錄和鏈接庫目錄。
使用ODB編譯器編譯數據庫文件
使用ODB都需要將我們的定義的數據庫類使用ODB的編譯器編譯成最終的odb數據庫類,這裏有兩種編譯方式:一種是我們編寫好自己的類文件後,手動執行編譯命令進行編譯,將編譯出的文件添加到Qt項目中;另一種是在Qt項目的.pro文件中自定義構建步驟,實現自動編譯和添加引用。
手動編譯
在控制檯中跳轉到Qt項目目錄,執行命令:
odb.exe --database sqlite --profile qt --generate-schema --generate-query --generate-session -ID:\Qt\Qt5.5.1_msvc2010\5.5\msvc2010\include employee.h
其中
參數:--profile qt
是編譯Qt項目時所必須的,詳見官網中關於PROFILES及Qt Profile的介紹
參數:-ID:\Qt\Qt5.5.1_msvc2010\5.5\msvc2010\include
是要向odb使用的mingw編譯器的引用目錄中,添加本機的Qt頭文件所在目錄。
編譯成功後,將編譯出的文件添加到Qt項目中。
修改.pro文件以自動編譯
這裏可以參考官方WIKI中的在Linux系統中的Qt Creator使用ODB這篇文章進行配置,只要將文章中給出的那段代碼,放置到.pro文件的最後,稍微修改即可。
我這邊修改後的.pro文件完整代碼如下:
QT -= gui
CONFIG += c++11 console
CONFIG -= app_bundle
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += main.cpp
HEADERS += \
database.hxx
INCLUDEPATH += $$PWD/include/
ODB_FILES += employee.h
# ODB compiler flags.
#
ODB_FLAGS = --database sqlite --profile qt --generate-schema --generate-query --generate-session
# Select the database we are going to use.
#
DEFINES += DATABASE_SQLITE
# Suppress unknown pragmas GCC warnings.
#
#QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CXXFLAGS_WARN_ON -Wno-unknown-pragmas // had a error
QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CXXFLAGS_WARN_ON
# Link to the ODB runtime libraries.
#
LIBS += -L$$PWD/lib
CONFIG(debug, debug|release) {
#Linking library
LIBS += -lodb-sqlite-d -lodb-d -lodb-qt-d
#Destination path
DESTDIR = $$PWD/debug/
} else {
LIBS += -lodb-sqlite -lodb -lodb-qt
DESTDIR = $$PWD/release/
}
# ODB compilation rules. Normally you don't need to change anything here.
#
# Add the Qt headers directory to the ODB include directory list.
#
ODB_FLAGS += -I$$[QT_INSTALL_HEADERS]
# Newer versions of QtCreator do builds in a separate directory. As a
# result, we need to append the source directory to ODB files.
#
for(dir, ODB_FILES) {
ODB_PWD_FILES += $$PWD/$${dir}
}
odb.name = odb ${QMAKE_FILE_IN}
odb.input = ODB_PWD_FILES
odb.output = ${QMAKE_FILE_BASE}-odb.cxx
odb.commands = odb.exe $$ODB_FLAGS ${QMAKE_FILE_IN}
odb.depends = $$ODB_PWD_FILES
odb.variable_out = SOURCES
odb.clean = ${QMAKE_FILE_BASE}-odb.cxx ${QMAKE_FILE_BASE}-odb.hxx ${QMAKE_FILE_BASE}-odb.ixx ${QMAKE_FILE_BASE}.sql
QMAKE_EXTRA_COMPILERS += odb
odbh.name = odb ${QMAKE_FILE_IN}
odbh.input = ODB_PWD_FILES
odbh.output = ${QMAKE_FILE_BASE}-odb.hxx
odbh.commands = @
odbh.CONFIG = no_link
odbh.depends = ${QMAKE_FILE_BASE}-odb.cxx
QMAKE_EXTRA_COMPILERS += odbh
其中 -Wno-unknown-pragmas
參數我這邊編譯時會報錯,所以我將其去掉了。
還有這種方式在使用時,經常遇到odb編譯出的文件找不到的情況,只要再依次執行清理、qmake、重新構建三步即可。
測試運行
odb的數據庫文件編譯成功後,基本就沒什麼問題了。爲了成功能夠正常運行,還需要將sqlite3、libodb、libodb-sqlite和libodb-qt四個項目中編譯出來的.dll文件拷貝到項目輸出目錄下。直接啓動測試程序,數據庫默認是在內存中創建的,想在硬盤中創建出數據庫文件,可以在控制檯中啓動程序,並加上參數--database test.db
即可。
問題記錄
編譯odb-sqlite庫時報錯:error LNK2001: 無法解析的外部符號 _sqlite3_unlock_notify
解決辦法:重新編譯啓用sqlite3_unlock_notify()函數的SQLite3庫,詳見本文編譯SQLite部分
ODB編譯數據庫文件時報錯:error: unable to map C++ type ‘::QString’ used in data member ‘name_’ to a SQLite database type
解決辦法:編譯時使用--profile qt
或-p qt
命令使ODB啓用Qt擴展,詳見本文手動編譯部分
ODB編譯數據庫文件時報錯:error: QtCore/QString: No such file or directory
解決辦法:編譯時使用-I
命令指定本機Qt頭文件位置,詳見本文手動編譯部分
Qt構建時報錯:cl: 命令行 error D8021 :無效的數值參數“/Wno-unknown-pragmas”
解決辦法:刪除.pro文件中添加的-Wno-unknown-pragmas
參數
編譯的文件和項目源碼
我編譯出的動態庫、靜態庫以及Demo項目源代碼可以在這裏下載:
http://download.csdn.net/download/nitefullwind/10200839