Qt多工程多目錄的編譯案例

源地址: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打開這個空的工程。右鍵菜單,選擇「新子項目」,建立便可。(*^__^*) 

相關文章
相關標籤/搜索