Linux C++ 開發2 - 編寫、編譯、執行第一個程式

陌尘(MoChen)發表於2024-08-08

上一篇《Linux C++ 開發1 - 搭建C++開發環境》我們搭建好了C++的開發環境,本篇我們將編寫、編譯、執行第一個程式。

1. 第一個C++程式

1.1. demo01.cpp

這裡寫一個最簡單的HelloWord程式

#include <iostream>

int main()
{
    std::cout << "Hello, world!" << std::endl;
    return 0;
}

1.2. 編譯和執行

這是最簡單的編譯和執行方式

# 進入原始碼目錄
cd demo 
# 編譯: g++ ./demo01.cpp 
g++ ./demo01.cpp 
# 執行: ./a.out 
./a.out 
Hello, world!

2. 更多編譯選項

2.1. 指定編譯的目標檔名

g++ ./demo01.cpp -o ./demo01
# 或
# g++ -o ./demo01 ./demo01.cpp
./demo01 
Hello, world!

2.2. 先編譯再連結

上面的命令直接把原始碼編譯連結成了可執行檔案,真實的編譯過程至少經歷了:預處理、編譯、連結的過程。我們把編譯過程拆解成編譯、連結兩個過程。

# 只編譯不連結,生成目標檔案:demo01.o
g++ -c ./demo01.cpp
# 將目標檔案連結成可執行檔案:demo01
g++ -o ./demo01 ./demo01.o
# 執行可執行檔案
./demo01 
Hello, world!

3. gcc 與 g++

GCC(GNU Compiler Collection)是一套由GNU專案開發的支援多種程式語言的編譯器工具鏈,裡面包含了gccg++工具。更多C/C++編譯器的介紹參見《一文搞懂C/C++常用編譯器》。

3.1. gcc編譯C++程式碼

上面的程式碼是g++來編譯的,其實我們也可以透過gcc來編譯,命令如下:

# 方法一
# 注意:不加-lstdc++的話,連結會報錯。
gcc demo01.cpp -lstdc++
./a.out 
Hello, world!
# 方法二
gcc -o demo01 demo01.cpp -lstdc++
./demo01 
Hello, world!
# 方法三
gcc -c ./demo01.cpp
gcc -o ./demo01 ./demo01.o -lstdc++ 
./demo01 
Hello, world!

可以看到gcc也可以正確編譯C++的程式碼,區別是需要加-lstdc++引數。這是因為g++預設連結了libstdc++,而gcc預設不連結,需要手動指定。

3.2. gcc與g++的區別

GUN的gcc和g++都是編譯器驅動程式,用於編譯和連結原始碼。它們的主要區別在於處理C++程式碼時的行為和預設設定。以下是它們的主要區別:

1. 預設語言標準:

gcc:預設處理C語言程式碼。
g++:預設處理C++語言程式碼。

2. 編譯器前端:

gcc:使用GCC(GNU Compiler Collection)的C編譯器前端。
g++:使用GCC的C++編譯器前端。

3. 預設庫連結:

gcc:在連結階段,預設只連結C標準庫。
g++:在連結階段,預設連結C++標準庫,同時也會連結C標準庫。

4. 處理C++特定語法和特性:

gcc:不支援C++特定的語法和特性。
g++:支援C++特定的語法和特性,如類、模板、名稱空間等。

5. .c原始檔的編譯:

gcc:把它當作是C程式。
g++:當作是c++程式。

備註: 字尾為.cpp的,兩者都會認為是c++程式。

6. 編譯選項:

gcc:可以使用-lstdc++選項來連結C++標準庫。
g++:不需要額外選項,預設連結C++標準庫。

總結來說,gcc主要用於編譯C程式碼,而g++主要用於編譯C++程式碼,並且在連結階段會自動處理C++標準庫的連結。如果你需要編譯C++程式碼,建議使用g++,這樣可以避免手動指定連結C++標準庫的麻煩。

4. gcc 和 g++ 的常用編譯選項

4.1. 常用編譯選項

  1. 基本選項

    • -o <file>:指定輸出檔案的名稱。
    • -c:只編譯不連結,生成目標檔案(.o)。
    • -E:只進行預處理,不編譯、彙編或連結。
    • -S:只編譯不彙編,生成彙編程式碼檔案(.s)。
  2. 最佳化選項

    • -O0:不進行最佳化(預設)。
    • -O1:基本最佳化。
    • -O2:更多最佳化,但會增加編譯時間。
    • -O3:最大程度最佳化,可能會顯著增加編譯時間。
    • -Os:最佳化大小,適用於嵌入式系統。
  3. 除錯選項

    • -g:生成除錯資訊,用於除錯工具(如GDB)。
    • -ggdb:生成GDB專用的除錯資訊。
  4. 警告選項

    • -Wall:啟用所有警告。
    • -Wextra:啟用額外的警告。
    • -Werror:將警告視為錯誤。
  5. 語言標準選項

    • gcc編譯C語言(.c)時使用的C標準:
      • -std=c99:使用C99標準。
      • -std=c11:使用C11標準。
      • -std=gnu99:使用GNU擴充套件的C99標準。
      • -std=gnu11:使用GNU擴充套件的C11標準。
    • g++編譯C++(.cpp)時使用的C標準:
      • -std=c++98:使用C++98標準。
      • -std=c++03:使用C++03標準。
      • -std=c++11:使用C++11標準。
      • -std=c++14:使用C++14標準。
      • -std=c++17:使用C++17標準。
      • -std=c++20:使用C++20標準。
  6. 連結選項

    • -l<library>:連結指定的庫。
    • -L<path>:指定庫檔案的搜尋路徑。
    • -static:靜態連結庫。
  7. 前處理器選項

    • -D<name>:定義宏。
    • -D<name>=<value>:定義帶值的宏。
    • -I<path>:新增標頭檔案搜尋路徑。
  8. 連結C++標準庫:

    • -lstdc++: 連結C++標準庫。(gcc編譯.cpp時要加上此選項;g++編譯可不加,因為預設會連結C++標準庫)
  9. 其他選項

    • -v:顯示編譯器的版本和配置資訊。
    • -save-temps:儲存中間檔案(如預處理檔案、彙編檔案等)。

4.2. 示例

g++ -o myprogram myfile.cpp -std=c++11 -O2 -Wall -g

上面的命令將編譯myfile.cpp檔案,生成myprogram可執行檔案,使用C++11標準,最佳化級別為2,啟用所有警告,生成除錯資訊。


大家好,我是陌塵。

IT從業10年+, 北漂過也深漂過,目前暫定居於杭州,未來不知還會飄向何方。

搞了8年C++,也幹過2年前端;用Python寫過書,也玩過一點PHP,未來還會折騰更多東西,不死不休。

感謝大家的關注,歡迎加我微信(Spencer_MC),期待與大家一起交流。



【SunLogging】
Linux C++ 開發2 - 編寫、編譯、執行第一個程式
掃碼二維碼,關注微信公眾號,閱讀更多精彩內容

相關文章