天天看點

qmake在.pro檔案中調用外部腳本或者exe

在用qt編寫程式的時候經常會用到依賴的庫但是總是需要自己去拷貝就顯得很麻煩,

下面我們來看看,在.pro檔案中編寫代碼去執行一個拷貝依賴檔案的腳本程式。

首先,我們在.pro檔案裡面加一下代碼

defineReplace(win32Path) {#定義替換

win32:1 ~= s|/|\\\\|g
    contains(1, ^\\.*):pfx = \\
    else:pfx =
    segs = $$split(1, \\)#字元串分割
    out =
    for(seg, segs) {
        equals(seg, ..):out = $$member(out, 0) #文檔中member函數是隻有兩個參數的,是以這個-2不清楚是做什麼的
        else:!equals(seg, .):out += $$seg
    }
    return($$join(out, \\, $$pfx))
}
win32 {

   copydata.commands  = $(COPY_FILE) $$win32Path("$$PWD/install.cmd") $$win32Path("$$PWD")
   first.depends = $(first) copydata
   export(first.depends)
   export(copydata.commands)
   QMAKE_EXTRA_TARGETS += first copydata#編譯其他目标
   CONFIG( debug, debug|release) {
   QMAKE_POST_LINK += $$win32Path("$$PWD/install.cmd") release $$win32Path("$$PWD/../../")#編譯qian執行
   } else {
       #QMAKE_POST_LINK += $$win32Path("$$OUT_PWD/install.cmd") release $$win32Path("$$PWD/../../")#編譯qian執行
   }
}
      

我想這應該不難看 懂。在config裡面的那句代碼就是執行目前路徑下的install.cmd檔案,看到沒,.pro檔案和install.cmd檔案是在一個路徑下的

qmake在.pro檔案中調用外部腳本或者exe

我這個install.cmd裡面寫的是:    echo a

    @echo b

    pause

很簡單的兩句指令。

qmake在.pro檔案中調用外部腳本或者exe

接着我們去點選重新建構:我們在編譯輸出裡面可以看到:我們cmd裡面代碼的執行結果:

qmake在.pro檔案中調用外部腳本或者exe

是不是輸出了a和b 呢,但是我們在cmd裡面用了pause,是以編譯也就卡住了,是以,我們在cmd裡面可以寫其他的代碼

下面是我寫的比較複雜的拷貝代碼,shell腳本

qmake在.pro檔案中調用外部腳本或者exe
以下是cmd檔案

set CP_DRV=%~d0                    #設定copy路徑
set CP_PATH=%~dp0                  #設定copy路徑

if not exist "%2" goto SOURC_ERR   #如果%2不存在則報錯

set INSTALL_DIR=%CP_PATH%..\install
set INSTALL_DIR_INC=%INSTALL_DIR%\include
set INSTALL_DIR_LIB=%INSTALL_DIR%\lib

set INSTALL_DIR_INC_COMMON=%INSTALL_DIR%\include\common

if not exist %INSTALL_DIR% mkdir %INSTALL_DIR%              #如果目錄不存在則建立
if not exist %INSTALL_DIR_INC%    mkdir %INSTALL_DIR_INC%
if not exist %INSTALL_DIR_INC_COMMON% mkdir %INSTALL_DIR_INC_COMMON%
if not exist %INSTALL_DIR_LIB%    mkdir %INSTALL_DIR_LIB%
set SOURCE_DIR=%2

rem copy header,                      #如果檔案存在,則拷貝進common路徑下
if exist %SOURCE_DIR%\common\\$D{PROJ_NAME_LOWER}def.h         copy %SOURCE_DIR%\common\\$D{PROJ_NAME_LOWER}def.h %INSTALL_DIR_INC_COMMON%\ /y
if exist %SOURCE_DIR%\common\\$D{PROJ_NAME_LOWER}diag.hxx      copy %SOURCE_DIR%\common\\$D{PROJ_NAME_LOWER}diag.hxx %INSTALL_DIR_INC_COMMON%\ /y
if exist %SOURCE_DIR%\common\\$D{PROJ_NAME_LOWER}sys.hxx       copy %SOURCE_DIR%\common\\$D{PROJ_NAME_LOWER}sys.hxx %INSTALL_DIR_INC_COMMON%\ /y

echo %INSTALL_DIR_LIB%
 echo %SOURCE_DIR%

rem copy lib                          #快速複制庫
set a=%1
echo %a%

if /i "%1" equ "debug" goto DEBUG                #如果%1等于debug則跳轉到debug
if /i "%1" equ "release" goto RELEASE

goto END

:DEBUG                                  #如果檔案存在,則拷貝進lib路徑下
 echo %CP_PATH%
if exist %CP_PATH%debug\ copy %CP_PATH%\debug\*.dll %INSTALL_DIR_LIB%\ /y
if exist %CP_PATH%debug\ copy %CP_PATH%\debug\*.pdb %INSTALL_DIR_LIB%\ /y
if exist %CP_PATH%debug\ copy %CP_PATH%\debug\*.lib %INSTALL_DIR_LIB%\ /y

goto END

:RELEASE
if exist %CP_PATH%release\ copy %CP_PATH%\release\*.dll %INSTALL_DIR_LIB%\ /y
if exist %CP_PATH%release\ copy %CP_PATH%\release\*.pdb %INSTALL_DIR_LIB%\ /y
if exist %CP_PATH%release\ copy %CP_PATH%\release\*.lib %INSTALL_DIR_LIB%\ /y


goto END

:SOURCE_ERR
echo error: the source dir is not specified.

:END
echo install exit.
      



繼續閱讀