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

其中 -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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章