CPP編譯器安裝(Windows環境)

Fighoh發表於2024-03-19

編譯器選擇

一些常用的C++編譯器:

  1. GNU Compiler Collection (GCC)
    • GCC支援多種程式語言,包括C++,是一個免費開源的編譯器套件,我們常用的是以下兩種。
      • GCC: C 語言編譯器,也稱為 gcc
      • **G++: **C++ 語言編譯器,也稱為 g++
    • 它是許多Linux發行版的預設編譯器,也可在其他作業系統上使用。
    • GCC提供了豐富的最佳化選項和功能,適用於各種型別的C++專案。
  2. Clang
    • Clang是LLVM專案的一部分,也是一個免費開源的編譯器。
    • 它支援C、C++和Objective-C等語言,並提供了更快的編譯速度和更好的錯誤報告。
    • Clang的模組化架構使其易於擴充套件和整合到其他工具中。
  3. Microsoft Visual C++ Compiler
    • Microsoft Visual C++是Windows平臺下的主要C++編譯器。
    • 它通常與Visual Studio整合,提供了豐富的開發工具和除錯功能。
    • Visual C++ Compiler也可以作為獨立的編譯器使用。

本文推薦使用GCC,當前區域賽用的應該都是GCC

使用MinGW或MSYS2安裝GCC

  • MinGW(Minimalist GNU for Windows)和MSYS2(Minimal SYStem 2)是在Windows上使用GCC的常用工具。
  • MinGW提供了基本的開發工具,而MSYS2則提供了更豐富的Unix風格的環境和包管理器。
  • 推薦使用MSYS2,因為它提供了更好的包管理和更新機制。
  1. 下載和安裝MSYS2

    • 訪問MSYS2的官方網站(https://www.msys2.org/)下載最新版本的安裝程式。
    • 執行安裝程式,按照提示完成安裝過程。安裝完成後,會生成一個MSYS2的命令列視窗。
  2. 配置映象源或代理

    • 配置msys2清華映象

      • 開啟你之前安裝的路徑找到msys2\etc\pacman.d可以看到mirrorlist.mingw32mirrorlist.mingw64mirrorlist.msys三個檔案。

      • 在檔案mirrorlist.mingw32中加入:

        Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686

      • 在檔案mirrorlist.mingw64中加入:

        Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64

      • 在檔案mirrorlist.msys中加入:

        Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch

    • 如果在之後的安裝過程中還是感到卡頓出現連線失敗的情況則需要配置代理

      • ~\msys2\etc\profile.d路徑下新增檔案proxy.sh

      • 檔案內容:

        export http_proxy=%PROXY_SERVER%:%PROXY_PORT%
        export https_proxy=%PROXY_SERVER%:%PROXY_PORT%
        

        注意裡面要填的是自己的代理伺服器和埠

  3. 更新包管理器

    • 開啟MSYS2命令列視窗,執行以下命令更新包管理器:

      pacman -Syu
      
  4. 安裝GCC

    • 在MSYS2命令列視窗中,執行以下命令安裝GCC:

      pacman -S mingw-w64-x86_64-toolchain
      
    • 這會安裝GCC以及其他必要的工具鏈。

  5. 新增環境變數

    將路徑~\msys2\mingw64\bin(注意~為省略內容,準確來說是你安裝的msys2中的mingw64裡面的bin資料夾)新增至環境變數

    • 可以搜尋path

      CPP編譯器安裝(Windows環境)
    • 也可以右鍵此電腦,選擇屬性,找到高階系統設定

    • 開啟後點選環境變數

    • 使用者變數中選中Path,點選編輯,然後新建~\msys2\mingw64\bin路徑新增即可,注意,如果新增了多個同名編譯器的路徑,他會預設選擇最上面那個路徑

  6. 驗證安裝

    • 安裝完成後,可以在命令列視窗中執行以下命令驗證GCC是否成功安裝:

      g++ -v
      
    • 如果安裝成功,將會顯示G++的版本資訊。

  7. 使用編譯器

​ 我們以g++為例

​ g++ 是 GCC 編譯器套件中用於編譯 C++ 程式碼的命令,可以直接在命令列呼叫並將cpp檔案編譯成exe可執行檔案,我們執行的就是編譯產生的exe檔案。通常,g++ 命令的一般形式如下:

g++ [選項] 檔名.cpp -o 輸出檔名

​ 其中:

  • [選項] 是一些可選的編譯選項,用於控制編譯的行為,例如最佳化級別、警告級別等。常見的選項包括:

    • -c:只編譯原始檔而不進行連結,生成目標檔案。

    • -g:在目標檔案中包含除錯資訊,以便使用偵錯程式進行除錯。

    • -Wall:顯示所有警告資訊。

    • -O2:啟用最佳化等級 2。

    • -std=c++20: 指定c++版本

    • 等等,具體選項可以使用 g++ --help 檢視。

    • 檔名.cpp 是你要編譯的 C++ 原始碼檔名。

    • -o 輸出檔名 指定編譯生成的可執行檔案的名稱,不用寫.exe這個擴充名。

​ 例如,要編譯一個名為 hello.cpp 的 C++ 原始碼檔案並將生成的可執行檔案命名為 hello,可以執行以下命令:

g++ hello.cpp -o hello

​ 如果要在編譯過程中啟用除錯資訊,可以新增 -g 選項:

g++ -g hello.cpp -o hello

​ 這樣編譯生成的可執行檔案 hello 就包含了除錯資訊,可以使用偵錯程式進行除錯,可以配合gdb使用(感興趣可以瞭解,產生除錯資訊都是用gdb產生的,gdb在是包含在剛才下載的工具鏈中的)。

配合使用 g++gdb 可以進行C++程式的編譯和除錯。下面是一個簡單的步驟:

  1. 編譯程式幷包含除錯資訊

    使用 g++ 編譯程式時,新增 -g 選項,以便在生成的可執行檔案中包含除錯資訊。例如:

    g++ -g a.cpp -o a
    
  2. 啟動偵錯程式

    使用 gdb 啟動偵錯程式,並指定要除錯的可執行檔案:

    gdb ./my_program
    
  3. 設定斷點

    gdb 命令列中,可以設定斷點以便在程式執行到某一行時暫停執行並進入除錯模式。例如,設定在 main 函式的第一行處的斷點:

    (gdb) break main
    
  4. 執行程式

    gdb 命令列中,輸入 run 命令來執行程式:

    (gdb) run
    
  5. 執行程式和除錯

    一旦程式執行起來,可以使用 step, next, continue 等命令來控制程式的執行,以及檢視變數的值、棧資訊等。例如:

    • step:逐行執行程式,如果遇到函式呼叫,則進入函式內部執行。
    • next:逐行執行程式,如果遇到函式呼叫,則直接執行函式並返回到下一行。
    • continue:繼續執行程式直到遇到下一個斷點或程式結束。
    • print 變數名:列印變數的值。
    • backtrace:檢視函式呼叫棧。
    • 等等。
  6. 退出偵錯程式

    當除錯完成後,可以使用 quit 命令退出 gdb 偵錯程式:

    (gdb) quit
    

    一個大致的使用過程

    CPP編譯器安裝(Windows環境)
    ❯ gdb ./a
    GNU gdb (GDB) 13.1
    Copyright (C) 2023 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    Type "show copying" and "show warranty" for details.
    This GDB was configured as "x86_64-w64-mingw32".
    Type "show configuration" for configuration details.
    For bug reporting instructions, please see:
    <https://www.gnu.org/software/gdb/bugs/>.
    Find the GDB manual and other documentation resources online at:
        <http://www.gnu.org/software/gdb/documentation/>.
    
    For help, type "help".
    Type "apropos word" to search for commands related to "word"...
    Reading symbols from ./a...
    (gdb) break main
    Breakpoint 1 at 0x140001464: file 1009.cpp, line 54.
    (gdb) run
    Starting program: C:\Users\Fighoh\file\code\c\test\a.exe
    [New Thread 18096.0x4a14]
    [New Thread 18096.0x13d8]
    [New Thread 18096.0x3d78]
    
    Thread 1 hit Breakpoint 1, main () at 1009.cpp:54
    54          ios::sync_with_stdio(false); cin.tie(nullptr);
    (gdb) step
    55          int _ = 1;
    (gdb) step
    56          cin >> _;
    (gdb) step
    2
    57          while (_--)
    (gdb) print(_)
    $1 = 2
    (gdb) run
    The program being debugged has been started already.
    Start it from the beginning? (y or n) n
    Program not restarted.
    (gdb) step
    58              solve();
    (gdb) step
    solve () at 1009.cpp:50
    50      }
    (gdb) step
    main () at 1009.cpp:57
    57          while (_--)
    (gdb) print(_)
    $2 = 1
    (gdb) step
    58              solve();
    (gdb) step
    solve () at 1009.cpp:50
    50      }
    (gdb) step
    main () at 1009.cpp:57
    57          while (_--)
    (gdb) print(_)
    $3 = 0
    (gdb) step
    59          return 0;
    (gdb) step
    60      }
    (gdb) step
    __tmainCRTStartup () at C:/M/B/src/mingw-w64/mingw-w64-crt/crt/crtexe.c:273
    273     C:/M/B/src/mingw-w64/mingw-w64-crt/crt/crtexe.c: No such file or directory.
    (gdb) quit
    A debugging session is active.
    
            Inferior 1 [process 18096] will be killed.
    
    Quit anyway? (y or n) y
    

相關文章