Windows下Qt5.5.1中使用ODB
文章出處:點選開啟連結
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
其中 -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