源地址:http://blog.csdn.net/libaineu2004/article/details/23625441linux
寫這篇文章的目的是爲了讓Qt像VC++那樣,支持一個工程包含多個項目。即1個App+多個動態庫。本案例以1個App+1個共享庫爲例:編程
工程源碼我已上傳http://download.csdn.net/detail/libaineu2004/7188655,歡迎下載!app
一、在D盤建立空文件夾qMultiui
二、使用Qt Creator建立App應用程序:BigWay。注意:建立模板是App,存放路徑是D:\qMulti.net
建立完成後,請關閉當前項目。設計
三、使用Qt Creator建立共享庫項目:SmallBoy。注意:建立模板是C++ lib,存放路徑是D:\qMultiunix
建立完成後,請關閉當前項目。blog
四、App和Lib建立完成以後,D:\qMulti的狀況以下:get
咱們手動新建一個文本文件D:\qMulti\qMulti.pro,內容以下:源碼
TEMPLATE=subdirs#表示這個是Qt跨目錄,由多個子項目(如1個應用程序+多個共享庫)組成的大項目
SUBDIRS=SmallBoyBigWay#大項目包含的各個子項目,其中BigWay是應用程序,SmallBoy是共享庫
CONFIG+=ordered#CONFIG選項要求各個子項目按順序編譯,子目錄的編譯順序在SUBDIRS中指明
到此爲止,狀況以下:
五、使用Qt Creator打開大項目qMulti.pro,能夠看到項目樹形結構以下:
(1)原始的BigWay.pro文件是這樣的:
#-------------------------------------------------
#
#ProjectcreatedbyQtCreator2014-04-13T20:18:17
#
#-------------------------------------------------
QT +=coregui
greaterThan(QT_MAJOR_VERSION,4):QT+=widgets
TARGET=BigWay
TEMPLATE=app
SOURCES+=main.cpp\
mainwindow.cpp
HEADERS +=mainwindow.h
FORMS +=mainwindow.ui
咱們將其修改成:
#-------------------------------------------------
#
#ProjectcreatedbyQtCreator2014-04-13T19:02:41
#
#-------------------------------------------------
QT+=coregui#須要的Qt庫
greaterThan(QT_MAJOR_VERSION,4):QT+=widgets
TARGET=BigWay#表示編譯後的庫名字爲BigWay
TEMPLATE=app#表示項目是應用程序模式
DESTDIR=../bin#定義項目編譯以後生成的結果文件的存放路徑
win32{#表示Windows環境的特殊設置,這個大括號不能單獨放在下一行,不然編譯會報錯
LIBS+=../bin/SmallBoy.lib#包含項目須要用到的共享庫
}
unix{#表示Linux環境的特殊設置,這個大括號不能單獨放在下一行,不然編譯會報錯
LIBS+=../bin/libSmallBoy.so#包含項目須要用到的共享庫,注意文件名多了關鍵字"lib",擴展名是.so
}
SOURCES+=main.cpp\#項目中的全部源文件的列表
mainwindow.cpp
HEADERS +=mainwindow.h#項目中的全部頭文件的列表
FORMS +=mainwindow.ui#項目中的全部.ui文件(由Qt設計器生成)的列表
(2)原始的SmallBoy.pro文件是這樣的:
#-------------------------------------------------
#
#ProjectcreatedbyQtCreator2014-04-13T20:24:55
#
#-------------------------------------------------
QT -=gui
TARGET=SmallBoy
TEMPLATE=lib
DEFINES+=SMALLBOY_LIBRARY
SOURCES+=qsmallboy.cpp
HEADERS+=qsmallboy.h\
smallboy_global.h
unix{
target.path=/usr/lib
INSTALLS+=target
}
咱們將其修改成:
#-------------------------------------------------
#
#ProjectcreatedbyQtCreator2014-04-13T19:04:24
#
#-------------------------------------------------
QT-=gui#不須要Qtui庫
TARGET=SmallBoy#表示編譯後的庫名字爲SmallBoy
TEMPLATE=lib#表示項目是共享庫模式
DEFINES+=SMALLBOY_LIBRARY#項目所需的額外的預處理程序定義的列表
DESTDIR=../bin#定義項目編譯以後生成的結果文件的存放路徑
SOURCES+=qsmallboy.cpp#項目中的全部源文件的列表
HEADERS+=qsmallboy.h\#項目中的全部頭文件的列表
smallboy_global.h
win32{#表示Windows環境的特殊設置,這個大括號不能單獨放在下一行,不然編譯會報錯
}
unix{#表示Linux環境的特殊設置,這個大括號不能單獨放在下一行,不然編譯會報錯
target.path=/usr/lib
INSTALLS+=target
}
六、Linux環境下使用
若是把完整的項目源碼qMulti拷貝到Ubantu Linux下的Qt編譯,編譯過程一切OK。可是運行時會報錯,說「errorwhile loading shared libraries: libSmallBoy.so.1: cannot open shared objectfile: No such file or directory」緣由指的是Linux下的共享庫路徑配置不正確,找不到libSmallBoy.so庫文件。默認的linux共享庫搜索路徑爲/lib和/usr/lib兩個目錄(不包含子目錄)。
解決方案有兩種:
(1)把編譯生成的四個.so文件所有拷貝到文件系統的路徑/usr/lib之下,須要管理員權限。
再運行程序,OK。
(2)修改Linux環境變量LD_LIBRARY_PATH,把Qt編程生成的路徑加入。
export LD_LIBRARY_PATH=/usr/local/lib
在終端裏運行上面這行命令,再運行程序,若是正常就說明解決問題。可是該方法只是臨時設置變量 LD_LIBRARY_PATH ,下次開機,一切設置將不復存在;
七、換一種思路建項目
以前步驟1~4講的是先建項目再建qMulti.pro文件。其實咱們能夠採起逆序,先建qMulti.pro文件,後建子項目SmallBoy和BigWay。
咱們手動新建一個文本文件D:\qMulti\qMulti.pro,內容以下:
TEMPLATE=subdirs#表示這個是Qt跨目錄,由多個子項目(如1個應用程序+多個共享庫)組成的大項目
CONFIG+=ordered#CONFIG選項要求各個子項目按順序編譯,子目錄的編譯順序在SUBDIRS中指明
或者用Qt Creator新建子目錄項目qMulti:
而後用Qt Creator打開這個空的工程。右鍵菜單,選擇「新子項目」,建立便可。(*^__^*)