Visual Studio 2017 運行、調試使用CMake構建的多可執行程序項目


  在 Windows 環境下,筆者主要通過 Visual Studio 進行較大型項目的查看和運行調試。這里記錄下使用 Visual Studio 編譯、運行和調試可能包含有多個可執行程序的多文件項目的方法,特別的,這里記錄的是使用 CMake 進行自動化構建的多文件項目。 

 

  使用 Visual Studio 打開項目

  目前許多大文件項目使用跨平台自動化構建系統 CMake 進行項目內部依賴關系的管理。簡單而言,CMake 使用統一規則的配置文件 CMakeLists.txt 記錄項目的依賴關系,再根據目標編譯平台生成對應的構建規則,如在 Linux 下可依據 CMakeLists.txt 生成項目對應的 Makefile ,在 Windows 環境下則生成項目的 Visual Studio 工程。

  Windows 環境下首先使用 CMake 生成項目對應的 Visual Studio 工程,通常項目的 README 文件中會有相應的描述。使用 CMake 的一般流程如下所示。

  ( Windows 環境需通過安裝包安裝 CMake,具體安裝見官方文檔,Windows 環境下,在項目根目錄下 Shift + 右鍵,在彈出菜單中選擇"在此處打開命令窗口",即可直接使用工作目錄為項目根目錄的命令行窗口)

    mkdir build          //在項目根目錄下新建名為 build 的目錄
    cd build             //進入 build 目錄
    cmake .. -G "Visual Studio 15 2017 Win64"        //在當前目錄中(即 build 目錄),以 .. (表示 build 的上一目錄,即為項目根目錄)作為源目錄生成 Visual Studio 工程文件

  最后一個命令中,-G 命令可以指定生成的 Visual Studio 工程的 Win64 版本,系統安裝的 CMake 支持的 Visual Studio 版本可通過命令行命令 cmake --help 命令查看。

  在上述命令執行完成后,當前 build 目錄中即存放有 cmake 生成的項目的 Visual Studio 工程,此時雙擊目錄中的 .sln 文件即自動通過 Visual Studio 打開該項目。

  

  Visual Studio 運行和調試程序

  在打開的 Visual Studio 界面中,主要通過解決方案資源管理器查看項目的文件結構,雙擊對應的文件從而顯示文件的具體內容,通過界面上部的生成、調試等工具欄進行程序的編譯、運行和調試工作。

  

  運行可能含有多個可執行程序的項目

  如下圖所示,在一個項目的解決方案中,可能存在多個子項目( 源文件、所需資源的集合 ),子項目以某種方式划分,同時存在相互依賴關系。如下圖的 decoder 子項目包含有程序的起始調用函數 main 函數,該子項目最終會生成可執行文件( .exe 文件),而 decode 子項目則是生成與 decoder 相關的庫文件( .lib 文件),供 decoder 調用。不同子項目的依賴關系等信息是在 CMake 配置中即指定了的。在使用 Visual Studio 進行程序的運行和調試時,需要人為的設置運行/調試時具體使用哪一個子項目(所對應的可執行程序)。具體而言,存在多個子項目可生成可執行程序時,選中需要運行/調試的可執行程序所對應的子項目(main函數所在的子項目),右鍵 -> 設為啟動項目。后續 VS 運行程序時,即啟動被設置為啟動項的子項目所生成的可執行程序。

  

  

  設置項目屬性

  對於每一個子項目,(如果默認設置不滿足需求時)可以分別設置它的屬性,以滿足各自的編譯/運行/調試等環境需求。選中某個子項目,右鍵 -> 屬性 (快捷鍵 Alt + Enter)可以進行該子項目的屬性設置。常規的屬性窗口如下圖所示。簡單使用時,主要配置 調試 條目中的命令參數和工作目錄,即可滿足程序運行的基本要求。其中,命令參數為執行可執行程序時傳遞給可執行程序的參數,而工作目錄指定了在進行相對路徑尋址的根目錄。另外需要注意,左上角的配置選項中,可以對 Release 和 Debug 進行切換,需要注意 Release 和 Debug 分別擁有自己的屬性設置,需要分別進行設置( 非共用 )。不同子項目的配置也需要分別進行指定。 

  完整的 Visual Studio 的屬性設置和使用可以參考官方文檔  Windows C++項目屬性頁引用 和 設置編譯器和生成屬性

  

   在對可執行程序進行 Debug/Release 屬性設置后,可以通過 Visual Studio 界面頂部的按鈕切換當前使用的配置,如下圖所示中正在使用的即為 Release 版本所設置的屬性。

  

  

  項目運行調試

  Visual Studio 可以通過界面頂端的 調試 選項中的條目對項目進行運行/調試。其中,運行/調試啟動的可執行程序是被設置為啟動項的子項目所生成的可執行程序,生成/調試使用的是頂部工具欄中確定的 Release/Debug 版本所對應的屬性。

  這里記錄下一些 Visual Studio 中運行和調試的常用操作。

  開始運行和調試

    F5                 //進入調試,或者通過界面上方工具欄的 調試 -> 開始調試 條目
    Ctrl + F5          //直接運行,或者通過工具欄 調試 -> 開始執行 條目,程序運行結束后會保留控制台,而不是立即退出,可以查看程序運行結束后輸出至控制台的信息

  調試操作

    F5              //繼續運行調試,直至觸發下一處斷點
    F10             //逐過程運行,如遇到函數時不會步入,而是直接運行至函數返回
    F11             //逐語句運行,如遇到函數時,會進入函數內部,從其第一條語句開始執行

  瀏覽文件

    Alt + F12             //速覽定義,會生成一個小窗口查看對應對象的定義
    F12                   //跳轉至對象定義的位置
    Ctrl + F12            //跳轉至對象聲明的位置
    Shift + F12           //查找所有引用

 

  使用 Visual Studio 的一些問題

  1.關閉某些 warning 的方法

  在 Visual Studio 環境下,會進行較為嚴格的編譯檢查,使得編譯程序時可能會出現較多數量的警告,在理想狀況下,應該修改代碼從而消除 warning。當然,用戶在某些情況下也可以直接將對應輸出的 warning 屏蔽,從而不讓其在編譯階段出現( 請注意這樣做的風險 )。用戶可以在對應文件中加入如下語句,從而關閉該文件中對應編號的 warning。

    #pragma warning( disable : 4101)        //編譯時關閉錯誤編號為 4101 的 warning 

 

  2.LNK1104 無法打開文件“/path/to/xxx.exe”

  在點擊 Visual Studio 2017 的運行按鈕時,產生上述報錯。筆者遇到該問題的情況中,主要由於系統中有一個 "xxx.exe" 進程正在運行中,即對應的可執行文件已經被某個進程占用了,從而使得 Visual Studio 提示找不到文件。用戶可以打開控制面板,尋找到 "xxx.exe" 的同名進程,再 右鍵 -> 結束任務 嘗試解決上述問題。若無法直接關閉,可以將任務管理器由 "進程" 切換到 "詳細信息" 欄目,找到的對應的進程進行關閉,或者直接重啟電腦。

 

  3.打開項目,通過 F5 或 Ctrl + F5 運行/調試程序時,編譯過程正常進行,但 VS 報錯顯示 "無法啟動程序xxxxx\ALL_BUILD。系統找不到指定的文件"

  在 VS中, 調試 -> 選項 -> 項目和解決方案 -> 生成並運行 中,默認會選中 "在運行時僅生成啟動項目和依賴項",即 VS 運行時只會編譯生成被設置為啟動項的子項目所對應的可執行程序以及它的依賴項。筆者查看的項目中, encoder 和 decoder 兩個子項目是可以生成獨立的可執行程序的,但剛使用 VS 打開項目時沒有設置它們為啟動項目( 剛打開 Visual Studio 時默認啟動項為 ALL_BUILD )。所以點擊 "本地 Windows 調試器 "或 Ctrl + F5 運行時,VS 會編譯和生成 ALL_BUILD 對應的可執行程序以及其所依賴的程序( 在解決方案資源管理器中,ALL_BUILD 子項目本身及其依賴的項,也就是整個項目本身 ) 。但是運行時,系統會認為 ALL_BUILD 是一個可執行文件的名字,從而去嘗試啟動 ALL_BUILD ,進而出現上述找不到指定 ALL_BUILD 文件的錯誤。解決方法是選中具體的某個可執行程序對應的子項目,右鍵 -> 設為啟動項目 將其設置為啟動項,則 VS 運行時會自動運行設置為啟動項的子項目所生成的可執行程序。

 

  參考

  Visual Studio 中的解決方案和項目

  設置編譯器和生成屬性

  Windows C++項目屬性頁引用


免責聲明!

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



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