上一篇《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專案開發的支援多種程式語言的編譯器工具鏈,裡面包含了gcc
和g++
工具。更多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. 常用編譯選項
-
基本選項:
-o <file>
:指定輸出檔案的名稱。-c
:只編譯不連結,生成目標檔案(.o
)。-E
:只進行預處理,不編譯、彙編或連結。-S
:只編譯不彙編,生成彙編程式碼檔案(.s
)。
-
最佳化選項:
-O0
:不進行最佳化(預設)。-O1
:基本最佳化。-O2
:更多最佳化,但會增加編譯時間。-O3
:最大程度最佳化,可能會顯著增加編譯時間。-Os
:最佳化大小,適用於嵌入式系統。
-
除錯選項:
-g
:生成除錯資訊,用於除錯工具(如GDB)。-ggdb
:生成GDB專用的除錯資訊。
-
警告選項:
-Wall
:啟用所有警告。-Wextra
:啟用額外的警告。-Werror
:將警告視為錯誤。
-
語言標準選項:
- 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標準。
- gcc編譯C語言(
-
連結選項:
-l<library>
:連結指定的庫。-L<path>
:指定庫檔案的搜尋路徑。-static
:靜態連結庫。
-
前處理器選項:
-D<name>
:定義宏。-D<name>=<value>
:定義帶值的宏。-I<path>
:新增標頭檔案搜尋路徑。
-
連結C++標準庫:
-lstdc++
: 連結C++標準庫。(gcc編譯.cpp時要加上此選項;g++編譯可不加,因為預設會連結C++標準庫)
-
其他選項:
-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),期待與大家一起交流。