Log4Qt 使用筆記(二)

  • 在前面Log4Qt 使用筆記(一)中,我們舉例演示了Log4Qt的簡單使用。在繼續深入學習Log4Qt之前,我想似乎有必要簡單整理一下qmake或者說Qt Creator下如何使用Log4Qt這些第三方庫的。

本文標題取爲:qmake下使用一例(以Log4Qt爲例) 可能會更好一點。想想還是就這樣吧。

如何使用第三方庫?

不少人使用第三方庫時都是:

  • 下載源碼
  • 找出必要的文件
  • 然後添加進自己的工程

一般來說,我們可以將所有和這個庫有關的東西放置到一個liblog4qt.pri這樣的文件中,然後在需要使用的工程中直接包含這個文件即可:

比如:我們先看看,上一節中我所寫例子所用的pro文件:

include(../../liblog4qt.pri)
CONFIG   += console
DESTDIR = $$PROJECT_BINDIR
SOURCES += main.cpp

有一點不同:這個文件背後,使用的不是直接包含文件,而是動態庫。這也是本文的內容。

題外

可以採用下面三種方式來使用QextSerialPort:
    靜態庫
    動態庫
    直接包含源文件 
不管使用哪種方式,使用時只需要在工程文件內添加
include(pathToPri/qextserialport.pri)

或許應該考慮將Log4Qt也改造成這種使用方式

工程結構示例

一個簡單的包含動態庫且又使用第三方庫的Qt程序,應該都可以這樣來組織工程結構:

+ 
|-- myProject.pro
|-- apps\
|     |-- hello.pro
|     `-- main.cpp
|-- libA\
|    |-- libA.pro
|    |-- libA.pri
|    `-- main.cpp
|-- libB\
|    |-- libB.pro
|    |-- libB.pri
|    `-- main.cpp
...
|-- libLog4Qt
|    |-- libLog4Qt.pro
|    `-- libLog4Qt.pri
|
`-- 3rdparty\
     |-- log4qt\
     |      `....
     |-- qextserialport\
     |--     `.... 

所有的第三方代碼放置到3rdParty下。程序由一個可執行程序和若干個動態鏈接庫構成(此處忽略了文檔doc和單元測試tests相關的目錄)

最終目的是:

  • 執行make或者點擊Qt Creator構建或運行時,所有這些東西都會自動生成。自動放置到合適的路徑(windows下)或者設置合適的rpath(Linux下),(本文只考慮windows下)
  • 不去動第三方庫的代碼。

使用Log4Qt

由於程序中包含很多動態庫,而幾乎每個動態庫都需要使用log功能,此時直接包含Log4Qt的源碼或者使用靜態庫都不是太好的注意。所以:使用動態庫

其實只要寫好工程文件,使用動態庫也很簡單:

創建libLog4Qt.pro

用來構建動態庫

可以單獨存在,也可以被上級的pro文件所包含(通過subdir)

創建libLog4Qt.pri

用來構建和使用動態庫

任何需要使用log工程的pro文件,只需要include該文件即可

不過這兩個文件,乍看起來,可能會讓人比較頭大:(但如果所有的動態庫都是這麼弄,倒是很簡單了)

libLog4Qt.pri

一開始定義幾個變量:

  • 我們下載的 log4qt 所放置的目錄
  • 我們的庫文件準備放置到的路徑(所有的動態庫都需要這個,放置到單獨一個common.pri中更好)
  • 庫文件的名字(使用了qtLibraryTarget,這樣在windows下debug和release自動擁有不同的名字,而且對我們是透明的,因爲我們只在這一個文件內指定庫文件的名字。)

LOG4QTSRCPATH = $$PWD/../3rdparty/log4qt/src
PROJECT_LIBDIR = $$PWD/../lib
PROJECT_BINDIR = $$PWD/../bin

TEMPLATE += fakelib
LIBLOG4QT_NAME = $$qtLibraryTarget(hlog4qt)
TEMPLATE -= fakelib

INCLUDEPATH += $$LOG4QTSRCPATH
DEPENDPATH += $$LOG4QTSRCPATH

!log4qt-buildlib{
    DEFINES += LOG4QT_IMPORTS
    LIBS +=  -L$$PROJECT_LIBDIR  -l$$LIBLOG4QT_NAME
}else{
    DEFINES += LOG4QT_EXPORTS
    INCLUDEPATH += -L$$PROJECT_LIBDIR $$LOG4QTSRCPATH/helpers \
                   $$LOG4QTSRCPATH/spi \
                   $$LOG4QTSRCPATH/varia
    DEPENDPATH += $$LOG4QTSRCPATH/helpers \
                   $$LOG4QTSRCPATH/spi \
                   $$LOG4QTSRCPATH/varia
    include($$LOG4QTSRCPATH/Log4Qt.pri)
}

無論是使用,還是構建動態庫,我們都使用這個文件。

  • 對於前者,只需要指定頭文件目錄,庫文件名即可
  • 對於後者,列出所有的源文件(由於它提供了Log4Qt.pri的文件,這兒就直接包含了)

liblog4qt.pro

這個文件中沒有任何新東西,就是構建一個動態庫

TEMPLATE = lib
CONFIG += log4qt-buildlib
QT += core xml network

include(liblog4qt.pri)
TARGET = $$LIBLOG4QT_NAME
DESTDIR = $$PROJECT_LIBDIR
win32{
    DLLDESTDIR = $$PROJECT_BINDIR
    QMAKE_DISTCLEAN += $$PROJECT_BINDIR/$${LIBLOG4QT_NAME}.dll
}
CONFIG += debug_and_release build_all

LOG4QT_VERSION_MAJOR = 1
LOG4QT_VERSION_MINOR = 0
LOG4QT_VERSION_RELEASE = 0

LOG4QT_VERSION = '\\"$${LOG4QT_VERSION_MAJOR}.$${LOG4QT_VERSION_MINOR}.$${LOG4QT_VERSION_RELEASE}\\"'
DEFINES += LOG4QT_VERSION_STR=\"$${LOG4QT_VERSION}\"
DEFINES += LOG4QT_VERSION=$${LOG4QT_VERSION}

VERSION = 1.0.0

DEPENDPATH += src src/helpers src/spisrc/ varia
INCLUDEPATH += src src/helpers src/spi src/varia

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