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

來源:互聯網
上載者:User

寫這篇文章的目的是為了讓Qt像VC++那樣,支援一個工程包含多重專案。即1個App+多個動態庫。本案例以1個App+1個共用庫為例:

工程源碼我已上傳http://download.csdn.net/detail/libaineu2004/7188655,歡迎下載。

1、在D盤建立空檔案夾qMulti

 

2、使用Qt Creator建立App應用程式:BigWay。注意:建立模板是App,存放路徑是D:\qMulti

建立完成後,請關閉當前項目。

 

 


3、使用Qt Creator建立共用庫項目:SmallBoy。注意:建立模板是C++ lib,存放路徑是D:\qMulti




建立完成後,請關閉當前項目。

 

4、App和Lib建立完成之後,D:\qMulti的情況如下:


我們手動建立一個文字檔D:\qMulti\qMulti.pro,內容如下:

TEMPLATE=subdirs#表示這個是Qt跨目錄,由多個子項目(如1個應用程式+多個共用庫)組成的大項目
 
SUBDIRS=SmallBoyBigWay#大項目包含的各個子項目,其中BigWay是應用程式,SmallBoy是共用庫
 
CONFIG+=ordered#CONFIG選項要求各個子項目按順序編譯,子目錄的編譯順序在SUBDIRS中指明

到此為止,情況如下:

 

5、使用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
}
 
6、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 ,下次開機,一切設定將不複存在;


 7、換一種思路建項目

之前步驟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開啟這個空的工程。右鍵菜單,選擇“新子項目”,建立即可。(*^__^*) 


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.