1. 程式人生 > >Windows下Qt5.5.1中使用ODB

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

請參考:http://blog.csdn.net/ivan_ljf/article/details/47761277

參考上文編譯。但是,ODB中用到了sqlite中的sqlite3_unlock_notify()函式,需要多做以下兩步:

  1. 在”專案屬性”-“配置屬性”-“前處理器”-“前處理器定義”中新增一個巨集:SQLITE_ENABLE_UNLOCK_NOTIFY
  2. 在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路徑下。

  1. 在Qt Creator中新建一個工程,將Demo程式中的employee.h和driver.cpp檔案拷貝到Qt的工程目錄下,並新增到專案中。
  2. 在工程目錄下新建include資料夾,將libodb、libodb-sqlite、libodb-qt三個專案的標頭檔案全部拷貝進include/odb/目錄,講sqlite3.h拷貝到include/目錄。
  3. 在工程目錄下新建lib資料夾,將sqlite3、libodb、libodb-sqlite和libodb-qt四個專案中編譯出來的.lib檔案全部拷貝進來。
  4. 修改專案的.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