各平台編譯器中的Pre-build及Post-build操作


  通常我們在編譯一個工程或是鏈接庫的時候,需要在編譯鏈接之前或者編譯鏈接之后執行一些操作,比如:拷貝一些第三方庫到工程的工作目錄下或執行一些批處理(shell)操作,這個時候就需要在編譯器環境中進行相關設置:

Visual Studio####

說明: 在vs2005以及以上都支持了Build Events, 同時可以支持多行命令.
而在vs2003中要想執行多行命令,只能把命令寫在一個批處理文件中,然后通過調用批處理來執行.

  • 打開Build Events方框步驟:
    1.右鍵單擊Solution Explorer,選擇Properties
    2.選擇Build Events,可以看到Pre-build 和Post-build,以及運行Post-build event 的條件

  • 可以在相應的編譯事件中添加以下常用操作:
    1.build完后修改build產物的名字(后綴),並覆蓋已有的同名文件.
    copy /y $(TargetFileName) $(TargetName).XXX
    2.調用外部命令或批處理:
    call "C:\Program Files\XXX.exe"
    3.條件判斷:
    IF NOT $(ConfigurationName) == Release GOTO end call "C:\Program Files\XXX.exe" $(ProjectDir)$(TargetName).cvp :end
    4.web project 自動部署
    copy $(TargetDir)*.* //MyServer/MyService/bin copy $(ProjectDir)*.ascx //MyServer/MyService
    5.拷貝文件到制定目錄
    copy "$(ProjectDir)pri.bin" "$(SolutionDir)$(SolutionName)\$(OutDir)"

xcode####

  1. 選擇項目TARGETS,進入Build Phases頁面
  2. 點擊“+”按鈕,選擇“New Run Script Phase”
  3. 在Shell選框中填入使用的bash版本,默認是/bin/sh
  4. 在接下來的方框中編寫想要執行的shell命令(支持所有shell命令)
  5. 如果是想建立編譯前事件,需將Run Script用鼠標拖動到Compile Sources之前,若是建立編譯后事件,則保證Run Script在最后即可

CMake####

在CMake中提供了add_custom_command和add_custom_target用來為某個目標或庫添加一些自定義命令,該命令本身會成為目標的一部分,僅在目標本身被構建時才會執行。如果該目標已經構建,命令將不會執行。

  • add_custom_command: 增加自定義的構建規則到生成的構建系統中
add_custom_command(TARGET target PRE_BUILD | PRE_LINK| POST_BUILD COMMAND command1[ARGS] [args1...] [COMMAND command2[ARGS] [args2...] ...] [WORKING_DIRECTORYdir] [COMMENT comment][VERBATIM]) 

命令執行的時機由如下參數決定:
1.PRE_BUILD - 命令將會在其他依賴項執行前執行
2.PRE_LINK - 命令將會在其他依賴項執行完后執行
3.POST_BUILD - 命令將會在目標構建完后執行。

  • add_custom_target: 增加一個沒有輸出的目標,使得它總是被構建
add_custom_target(Name [ALL][command1 [args1...]] [COMMAND command2 [args2...] ...] [DEPENDS depend depend depend ... ] [WORKING_DIRECTORY dir] [COMMENT comment] [VERBATIM] [SOURCES src1 [src2...]]) 

增加一個指定名字的目標,並執行指定的命令。該目標沒有輸出文件,總是被認為是過期的,即使是在試圖用目標的名字創建一個文件。如果指定了ALL選項,那就表明該目標會被添加到默認的構建目標,使得它每次都被運行。

關於以上兩個編譯命令的具體用法,可以參考以下鏈接:CMake客制化命令

例子(在CMake文件中任意位置添加):

ADD_CUSTOM_TARGET(
    TestExample ALL
)
ADD_CUSTOM_COMMAND(TARGET TestExample
        PRE_BUILD
        COMMAND chmod 700 /home/chenjs/test
        COMMAND /home/chenjs/test -c -o ../../output ../../input/test.txt
        COMMENT "Generate project output file" 
)

Jni環境下的Android.mk####

在使用NDK為Android項目編譯CPP庫時,可以直接在Android.mk中添加執行Shell命令,需要注意的是在Cywin以及在Linux下編譯的不同點,並對兩個平台區別對待處理
例子(在Android.mk文件中正確添加):

ifndef SYSENV SYSENV := $(shell uname) endif ifeq (CYGWIN,$(findstring CYGWIN,$(SYSENV))) $(info Generate project output file under cywin) $(shell ../../tools/test.exe -c -o ../../output ../../output ../../input/test.txt) else ifeq ($(SYSENV), Linux) $(info Generate project output file under linux) $(shell chmod 700 /home/chenjs/test) $(shell /home/chenjs/test -c -o ../../output ../../input/test.txt) endif 

參考鏈接:
MSDN build events
Visual Studio build event使用方法
CMake客制化命令
Android.mk中條用shell bash命令
Android.mk詳解



作者:drybeans
鏈接:https://www.jianshu.com/p/66df9650a9e2
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

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



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