-
在前面Log4Qt 使用筆記(一)中,我們舉例演示了Log4Qt的簡單使用。在繼續深入學習Log4Qt之前,我想似乎有必要簡單整理一下qmake或者說Qt Creator下如何使用Log4Qt這些第三方庫的。
本文標題取爲:qmake下使用一例(以Log4Qt爲例) 可能會更好一點。想想還是就這樣吧。
如何使用第三方庫?
不少人使用第三方庫時都是:
- 下載源碼
- 找出必要的文件
- 然後添加進自己的工程
一般來說,我們可以將所有和這個庫有關的東西放置到一個liblog4qt.pri這樣的文件中,然後在需要使用的工程中直接包含這個文件即可:
比如:我們先看看,上一節中我所寫例子所用的pro文件:
include(../../liblog4qt.pri) CONFIG += console DESTDIR = $$PROJECT_BINDIR SOURCES += main.cpp
有一點不同:這個文件背後,使用的不是直接包含文件,而是動態庫。這也是本文的內容。
題外
-
注:在http://code.google.com/r/dbzhang800-qextserialport/這個第三方庫中,我採用的另一種思路
可以採用下面三種方式來使用QextSerialPort: 靜態庫 動態庫 直接包含源文件 不管使用哪種方式,使用時只需要在工程文件內添加 include(pathToPri/qextserialport.pri)
或許應該考慮將Log4Qt也改造成這種使用方式
-
注:本文或許算是qmake使用實踐:包含動態庫的Qt4工程一文的後續。
- 內容似乎太亂了,只好限定在:Windows下,這樣可以省點代碼
工程結構示例
一個簡單的包含動態庫且又使用第三方庫的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