寫這篇文章的目的是為了讓Qt像VC++那樣,支持一個工程包含多個項目,。即1個App+多個動態(tài)庫,。本案例以1個App+1個共享庫為例: 工程源碼我已上傳http://download.csdn.net/detail/libaineu2004/7188655,歡迎下載,! 1,、在D盤創(chuàng)建空文件夾qMulti
2,、使用Qt Creator創(chuàng)建App應用程序:BigWay。注意:創(chuàng)建模板是App,,存放路徑是D:\qMulti
創(chuàng)建完成后,,請關(guān)閉當前項目。 3,、使用Qt Creator創(chuàng)建共享庫項目:SmallBoy,。注意:創(chuàng)建模板是C++ lib,存放路徑是D:\qMulti
創(chuàng)建完成后,,請關(guān)閉當前項目,。
4、App和Lib創(chuàng)建完成之后,,D:\qMulti的情況如下:
我們手動新建一個文本文件D:\qMulti\qMulti.pro,,內(nèi)容如下: TEMPLATE=subdirs#表示這個是Qt跨目錄,由多個子項目(如1個應用程序+多個共享庫)組成的大項目 SUBDIRS=SmallBoyBigWay#大項目包含的各個子項目,其中BigWay是應用程序,SmallBoy是共享庫 CONFIG+=ordered#CONFIG選項要求各個子項目按順序編譯,子目錄的編譯順序在SUBDIRS中指明 到此為止,,情況如下:
5,、使用Qt Creator打開大項目qMulti.pro,可以看到項目樹形結(jié)構(gòu)如下: (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#定義項目編譯之后生成的結(jié)果文件的存放路徑 win32{#表示W(wǎng)indows環(huán)境的特殊設(shè)置,,這個大括號不能單獨放在下一行,,否則編譯會報錯 LIBS+=../bin/SmallBoy.lib#包含項目需要用到的共享庫 } unix{#表示Linux環(huán)境的特殊設(shè)置,這個大括號不能單獨放在下一行,,否則編譯會報錯 LIBS+=../bin/libSmallBoy.so#包含項目需要用到的共享庫,,注意文件名多了關(guān)鍵字"lib",擴展名是.so } SOURCES+=main.cpp\#項目中的所有源文件的列表 mainwindow.cpp HEADERS +=mainwindow.h#項目中的所有頭文件的列表 FORMS +=mainwindow.ui#項目中的所有.ui文件(由Qt設(shè)計器生成)的列表 (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#定義項目編譯之后生成的結(jié)果文件的存放路徑 SOURCES+=qsmallboy.cpp#項目中的所有源文件的列表 HEADERS+=qsmallboy.h\#項目中的所有頭文件的列表 smallboy_global.h win32{#表示W(wǎng)indows環(huán)境的特殊設(shè)置,,這個大括號不能單獨放在下一行,,否則編譯會報錯 } unix{#表示Linux環(huán)境的特殊設(shè)置,這個大括號不能單獨放在下一行,,否則編譯會報錯 target.path=/usr/lib INSTALLS+=target } 6,、Linux環(huán)境下使用 如果把完整的項目源碼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文件全部拷貝到文件系統(tǒng)的路徑/usr/lib之下,需要管理員權(quán)限,。 再運行程序,,OK。 (2)修改Linux環(huán)境變量LD_LIBRARY_PATH,把Qt編程生成的路徑加入,。 export LD_LIBRARY_PATH=/usr/local/lib 在終端里運行上面這行命令,,再運行程序,如果正常就說明解決問題,。但是該方法只是臨時設(shè)置變量 LD_LIBRARY_PATH ,,下次開機,一切設(shè)置將不復存在,; 7,、換一種思路建項目 之前步驟1~4講的是先建項目再建qMulti.pro文件。其實我們可以采取逆序,,先建qMulti.pro文件,,后建子項目SmallBoy和BigWay。
我們手動新建一個文本文件D:\qMulti\qMulti.pro,,內(nèi)容如下: TEMPLATE=subdirs#表示這個是Qt跨目錄,由多個子項目(如1個應用程序+多個共享庫)組成的大項目 CONFIG+=ordered#CONFIG選項要求各個子項目按順序編譯,,子目錄的編譯順序在SUBDIRS中指明 或者用Qt Creator新建子目錄項目qMulti: 然后用Qt Creator打開這個空的工程。右鍵菜單,,選擇“新子項目”,,創(chuàng)建即可。(*^__^*)
|
|