Qt在pro中實現條件編譯


 

https://www.cnblogs.com/Braveliu/p/5107550.html

https://blog.csdn.net/simonforfuture/article/details/78580510

 

關於Qt中project文件中的變量配置,可以查看Qt幫助文檔中的variable變量手冊,如下圖

Qt中Pri文件在大型項目中的使用

 

 

在QT .pro文件中添加自定義了宏:
DEFINES += ANDROID_TV
那么如果要判斷該宏是否存在,可以這么寫

 

xx.pro
contains(DEFINES,ANDROID_TV)
{
    message('-->>(DEFINES,ANDROID_TV)')
}
else
{
    message('-->>(DEFINES,ANDROID_TV) nothing')
}

 

在用Qt進行嵌入式linux開發時,有時為了調試便利,桌面版linux環境也會配置一份,這樣在編譯時就會調用不同版本的庫。

qmake提供很多功能強大的內置函數和變量,為動態編譯項目提供了便利。

方式一:使用contains()

DEFINES += RUN_ON_EMBEDDEDSYSTEM
 
if(contains(DEFINES,RUN_ON_EMBEDDEDSYSTEM)){#contains和{必須在同一行,否則報錯
 
INCLUDEPATH +=  /root/802/trunk/dsp/c6accel_1_01_00_07/soc/packages \
                /root/802/trunk/dsp/codec-engine_2_26_02_11/packages \
                /root/802/trunk/dsp/framework-components_2_26_00_01/packages \
                /root/802/trunk/dsp/dsplink_1_65_01_05_eng/packages \
                /root/802/trunk/dsp/dsplink_1_65_01_05_eng \
                /root/802/trunk/dsp/xdais_6_26_01_03/packages \
                /root/802/trunk/dsp/linuxutils_2_26_02_05/packages \
                /root/802/trunk/dsp/local-power-manager_1_24_03_10_eng/packages \
                /root/802/trunk/dsp/codecs-omap3530_4_02_00_00/packages \
                /root/802/trunk/tools/xdctools_3_16_03_36/packages \
                /root/802/trunk/dsp/c6accel_1_01_00_07/soc/c6accelw \
                /root/802/trunk/dsp/dmai_2_20_00_15/packages \
                /root/802/trunk/app/ortp-0.24.2/include \
                /root/802/trunk/app/ffmpeg-2.8.2
 
LIBS += /usr/lib/libjthread.so \
        /usr/lib/libjrtp.so \
}else{
LIBS+= /usr/local/lib/libjthread.so \
       /usr/local/lib/libjrtp.so \
       /usr/local/lib/libavdevice.so\
       /usr/local/lib/libavcodec.so\
       /usr/local/lib/libavfilter.so\
       /usr/local/lib/libavformat.so\
       /usr/local/lib/libavutil.so\
       /usr/local/lib/libpostproc.so\
       /usr/local/lib/libswresample.so\
       /usr/local/lib/libswscale.so\

 

方法二:使用CONFIG        

CONFIG 變量用於指定工程配置和編譯器選項,通常取debug,release,dll等值,也可以自定義選項值, CONFIG變量的每個選項都可以用於條件判斷。

CONFIG += qt5  
  
qt5{  
LIBS += -lmydll_qt5  
}else{  
LIBS += -lmydll  
}

 

 
DESTDIR: 
用於指明編譯的目標文件的輸出路徑。 當需要根據不同的平台設置不同的輸出路徑時,可以使用下面的方法

win32{

    DESTDIR = ../../Lib/WIN32 } unix{ DESTDIR = ../../Lib/unix } TARGET: 目標名稱。不包括后綴名。后綴名會根據 TEMPLATE ,平台 自動增加。 如果需要為調試版本的庫文件增加d后綴,那么可以用如下方法: CONFIG(debug, debug|release){ # 在DEBUG 版本后加入 d后綴 TARGET = $$join(TARGET,,,d) } TEMPLATE: 項目模板,一般在創建時QtCreator會自動幫你寫入對應的參數 app - 建立一個應用程序的makefile。這是默認值,所以如果模板沒有被指定,這個將被使用。 lib - 建立一個庫的makefile。 vcapp - 建立一個應用程序的Visual Studio項目文件。 vclib - 建立一個庫的Visual Studio項目文件。 subdirs - 這是一個特殊的模板,它可以創建一個能夠進入特定目錄並且為一個項目文件生成makefile並且為它調用make的makefile。 “app”模板 “app”模板告訴qmake為建立一個應用程序生成一個makefile。當使用這個模板時,下面這些qmake系統變量是被承認的。你應該在你的.pro文件中使用它們來為你的應用程序指定特定信息。 INCLUDEPATH: 頭文件搜索路徑 DEFINES: -D參數 CONFIG: 配置變量指定了編譯器所要使用的選項和所需要被連接的庫。配置變量中可以添加任何東西,但只有下面這些選項可以被qmake識別。 下面這些選項控制着使用哪些編譯器標志: release - 應用程序將以release模式連編。如果“debug”被指定,它將被忽略。 debug - 應用程序將以debug模式連編。 warn_on - 編譯器會輸出盡可能多的警告信息。如果“warn_off”被指定,它將被忽略。 warn_off - 編譯器會輸出盡可能少的警告信息。 下面這些選項定義了所要連編的庫/應用程序的類型: qt - 應用程序是一個Qt應用程序,並且Qt庫將會被連接。 thread - 應用程序是一個多線程應用程序。 x11 - 應用程序是一個X11應用程序或庫。 windows - 只用於“app”模板:應用程序是一個Windows下的窗口應用程序。 console - 只用於“app”模板:應用程序是一個Windows下的控制台應用程序。 dll - 只用於“lib”模板:庫是一個共享庫(dll)。 staticlib - 只用於“lib”模板:庫是一個靜態庫。 plugin - 只用於“lib”模板:庫是一個插件,這將會使dll選項生效。 例如,如果你的應用程序使用Qt庫,並且你想把它連編為一個可調試的多線程的應用程序,你的項目文件應該會有下面這行:     CONFIG += qt thread debug注意,你必須使用“+=”,不要使用“=”,否則qmake就不能正確使用連編Qt的設置了,比如沒法獲得所編譯的Qt庫的類型了。  HEADERS - 應用程序中的所有頭文件的列表。 SOURCES - 應用程序中的所有源文件的列表。 FORMS - 應用程序中的所有.ui文件(由Qt設計器生成)的列表。 LEXSOURCES - 應用程序中的所有lex源文件的列表。 YACCSOURCES - 應用程序中的所有yacc源文件的列表。 DEPENDPATH - 應用程序所依賴的搜索路徑。 VPATH - 尋找補充文件的搜索路徑。 RC_FILE - 只有Windows需要:應用程序的資源文件。 RES_FILE - 只有Windows需要:應用程序所要連接的資源文件。 CONFIG變量   qmake高級概念 操作符 “=”操作符      分配一個值給一個變量 “+=”操作符     向一個變量的值的列表中添加一個值 “-=”操作符      從一個變量的值的列表中移去一個值 “*=”操作符      僅僅在一個值不存在於一個變量的值的列表中的時候,把它添加進去 “~=”操作符      替換任何與指定的值的正則表達式匹配的任何值 DEFINES ~= s/QT_[DT].+/QT 作用域
win32:thread {
        DEFINES += QT_THREAD_SUPPORT    

} else:debug {        

       DEFINES += QT_NOTHREAD_DEBUG    

} else {       

       warning("Unknown configuration")    

           }    

}
 變量 到目前為止我們遇到的變量都是系統變量,比如DEFINES、SOURCES和HEADERS。你也可以為你自己創建自己的變量,這樣你就可以在作用域中使用它們了。創建自己的變量很容易,只要命名它並且分配一些東西給它。比如:  MY_VARIABLE = value你也可以通過在其它任何一個變量的變量名前加 來把這個變量的值分配給當前的變量。例如:MYDEFINES= 來把這個變量的值分配給當前的變量。例如:MYDEFINES= DEFINESMY_DEFINES = DEFINES第二種方法允許你把一個變量和其它變量連接起來,而不用使用空格。qmake將允許一個變量包含任何東西(包括$(VALUE),可以直接在makefile中直接放置,並且允許它適當地擴張,通常是一個環境變量)。無論如何,如果你需要立即設置一個環境變量,然后你就可以使用 DEFINES第二種方法允許你把一個變量和其它變量連接起來,而不用使用空格。qmake將允許一個變量包含任何東西(包括$(VALUE),可以直接在makefile中直接放置,並且允許它適當地擴張,通常是一個環境變量)。無論如何,如果你需要立即設置一個環境變量,然后你就可以使用 ()方法。比如:     MY_DEFINES = (ENVDEFINES)這將會設置MYDEFINES為環境變量ENVDEFINES傳遞給.pro文件地值。
另外你可以在替換的變量里調用內置函數。這些函數(不會和下一節中列舉的測試函數混淆)
列出如下:join(variablename,glue,before,after)這將會在variablename的各個值中間加入glue。
如果這個變量的值為非空,那么就會在值的前面加一個前綴before和一個后綴after。只有variablename是必須的字段,其它默認情況下為空串。
如果你需要在glue、before或者after中使用空格的話,你必須提供它們。member(variablename,position)這將會放置variablename的列表中的position位置的值。
如果variablename不夠長,這將會返回一個空串。variablename是唯一必須的字段,如果沒有指定位置,則默認為列表中的第一個值。
find(variablename,substr)這將會放置variablename中所有匹配substr的值。substr也可以是正則表達式,而因此將被匹配。MYVAR=onetwothreefourMYVAR2= (ENVDEFINES)這將會設置MYDEFINES為環境變量ENVDEFINES傳遞給.pro文件地值。
另外你可以在替換的變量里調用內置函數。這些函數(不會和下一節中列舉的測試函數混淆)
列出如下:join(variablename,glue,before,after)這將會在variablename的各個值中間加入glue。
如果這個變量的值為非空,那么就會在值的前面加一個前綴before和一個后綴after。
只有variablename是必須的字段,其它默認情況下為空串。如果你需要在glue、before或者after中使用空格的話,你必須提供它們。
member(variablename,position)這將會放置variablename的列表中的position位置的值。如果variablename不夠長,這將會返回一個空串。
variablename是唯一必須的字段,如果沒有指定位置,則默認為列表中的第一個值。find(variablename,substr)這將會放置variablename中所有匹配substr的值。
substr也可以是正則表達式,而因此將被匹配。MYVAR=onetwothreefourMYVAR2= join(MY_VAR, " -L", -L) -Lfive    MY_VAR3 = member(MYVAR,2) member(MYVAR,2) find(MY_VAR, t.*)MY_VAR2將會包含“-Lone -Ltwo -Lthree -Lfour -Lfive”,並且MYVAR3將會包含“three two three”。 system( program_and_args ) 這將會返回程序執行在標准輸出/標准錯誤輸出的內容,並且正像平時所期待地分析它。比如你可以使用這個來詢問有關平台的信息。     UNAME = system(uname−s)contains(UNAME,[lL]inux):message(ThislookslikeLinux( system(uname−s)contains(UNAME,[lL]inux):message(ThislookslikeLinux( UNAME) to me )測試函數 qmake提供了可以簡單執行,但強大測試的內置函數。這些測試也可以用在作用域中(就像上面一樣),在一些情況下,忽略它的測試值,它自己使用測試函數是很有用的。 contains( variablename, value ) 如果value存在於一個被叫做variablename的變量的值的列表中,那么這個作用域中的設置將會被處理。例如:     contains( CONFIG, thread ) {        DEFINES += QT_THREAD_SUPPORT    }
如果thread存在於CONFIG變量的值的列表中時,那么QT_THREAD_SUPPORT將會被加入到DEFINES變量的值的列表中。 count( variablename, number ) 如果number與一個被叫做variablename的變量的值的數量一致,那么這個作用域中的設置將會被處理。例如:     count( DEFINES, 5 ) {        CONFIG += debug    }error( string ) 這個函數輸出所給定的字符串,然后會使qmake退出。例如:     error( "An error has occured" )文本“An error has occured”將會被顯示在控制台上並且qmake將會退出。 exists( filename ) 如果指定文件存在,那么這個作用域中的設置將會被處理。例如:     exists( /local/qt/qmake/main.cpp ) {        SOURCES += main.cpp    }
如果/local/qt/qmake/main.cpp存在,那么main.cpp將會被添加到源文件列表中。 注意可以不用考慮平台使用“/”作為目錄的分隔符include( filename ) 項目文件在這一點時包含這個文件名的內容,所以指定文件中的任何設置都將會被處理。例如:      include( myotherapp.pro )myotherapp.pro項目文件中的任何設置現在都會被處理。 isEmpty( variablename ) 這和使用count( variablename, 0 )是一樣的。如果叫做variablename的變量沒有任何元素,那么這個作用域中的設置將會被處理。例如:     isEmpty( CONFIG ) {        CONFIG += qt warn_on debug    }
message( string ) 這個函數只是簡單地在控制台上輸出消息。     message( "This is a message" )文本“This is a message”被輸出到控制台上並且對於項目文件的處理將會繼續進行。 system( command ) 特定指令被執行並且如果它返回一個1的退出值,那么這個作用域中的設置將會被處理。例如:     system( ls /bin ) {        SOURCES += bin/main.cpp        HEADERS += bin/main.h    }
所以如果命令ls /bin返回1,那么bin/main.cpp將被添加到源文件列表中並且bin/main.h將被添加到頭文件列表中。 infile( filename, var, val ) 如果filename文件(當它被qmake自己解析時)包含一個值為val的變量var,那么這個函數將會返回成功。你也可以不傳遞第三個參數(val),這時函數將只測試文件中是否分配有這樣一個變量var。
# 項目目標:為一個庫文件

TEMPLATE = lib
# 編譯項目文件所需頭文件的路徑
INCLUDEPATH += ../common .
# 目標文件路徑
DESTDIR=../lib
# 條件依賴:Unix平台上 定義本想目的 UI目錄, MOC目錄, 目的目錄
unix {  UI_DIR = ../.ui  MOC_DIR = ../.moc  OBJECTS_DIR = ../.obj}
# 本項目配置
:CONFIG         += qt warn_on release thread
# Input  頭文件,源文件
HEADERS += COMControllerThread.h \ 
       DecodeSMS.h \ 
        monitor_common.h \
           monitor_interface.h \
           MonitorThread.h \
           UserEvent.h \
           MyCOM.
 ============================================================================================== 同時在百度文庫里面,有一個文檔,說明pro文件的一些關鍵字,比如如何導入其他庫:http://wenku.baidu.com/view/d02a4126ccbff121dd36838a.html --------------------- 

https://blog.csdn.net/abeldeng/article/details/25029507

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM