gcc 和 g++ 的联系和区别,使用 gcc 编译 c++
GCC 編譯器已經為我們提供了調用它的接口,對于 C 語言或者 C++ 程序,可以通過執行 gcc 或者 g++ 指令來調用 GCC 編譯器。
實際使用中我們更習慣使用 gcc 指令編譯 C 語言程序,用 g++ 指令編譯 C++ 代碼。需要強調的一點是,這并不是 gcc 和 g++ 的區別,gcc 指令也可以用來編譯 C++ 程序,同樣 g++ 指令也可以用于編譯 C 語言程序。
實際上,只要是 GCC 支持編譯的程序代碼,都可以使用 gcc 命令完成編譯。可以這樣理解,gcc 是 GCC 編譯器的通用編譯指令,因為根據程序文件的后綴名,gcc 指令可以自行判斷出當前程序所用編程語言的類別,比如:
xxx.c:默認以編譯C語言程序的方式編譯此文件xxx.cpp:默認以編譯C++程序的方式編譯此文件xxx.m:默認以編譯Objective-C程序的方式編譯此文件xxx.go:默認以編譯Go語言程序的方式編譯此文件
當然,gcc 指令也為用戶提供了 “手動指定代表編譯方式” 的接口,即使用 -x 選項:
gcc -xc xxx表示以編譯C語言代碼的方式編譯 xxx 文件gcc -xc++ xxx則表示以編譯C++代碼的方式編譯 xxx 文件
但如果使用 g++ 指令,則無論目標文件的后綴名是什么,該指令都一律按照編譯 C++ 代碼的方式編譯該文件。也就是說,
- 對于
.c文件來說,gcc指令以C語言代碼對待,g++指令會以C++代碼對待。 - 但對于
.cpp文件來說,gcc和g++都會以C++代碼的方式編譯。
C++ 標準對代碼書寫規范的要求更加嚴格。
除此之外對于編譯執行 C++ 程序,使用 gcc 和 g++ 也是有區別的。要知道,很多 C++ 程序都會調用某些標準庫中現有的函數或者類對象,而單純的 gcc 命令是無法自動鏈接這些標準庫文件的。舉個例子:
//test.cpp
#include <iostream>
#include <string>
using namespace std;int main(){string str ="hello,world";cout << str << endl;return 0;
}
這是一段很簡單的 C++ 程序,其通過 <string> 頭文件提供的 string 字符串類定義了一個字符串對象,隨后使用 cout 輸出流對象將其輸出。對于這段 C++ 代碼,如果我們使用 g++ 指令編譯,如下所示:
[wohu@ubuntu~]$ g++ test.cpp
[wohu@ubuntu~]$
可以看到,整個編譯過程沒有報任何錯誤。但如果使用 gcc 指令:
[wohu@ubuntu~]$ gcc test.cpp
/tmp/ccluIPFx.o: In function `main':
test.cpp:(.text+0x20): undefined reference to `std::allocator<char>::allocator()'
....
/tmp/ccluIPFx.o:(.eh_frame+0x13): undefined reference to `__gxx_personality_v0'
collect2: error: ld returned 1 exit status
其根本原因就在于,該程序中使用了標準庫 <iostream> 和 <string> 提供的類對象,而 gcc 默認是無法找到它們的。
如果想使用 gcc 指令來編譯執行 C++ 程序,需要在使用 gcc 指令時,手動為其添加 -lstdc++ 選項,表示 gcc 在編譯 C++ 程序時可以鏈接必要的 C++ 標準庫。如下示例:
[wohu@ubuntu~]$ gcc test.cpp -lstdc++
[wohu@ubuntu~]$
由此,test.cpp 就被成功的編譯了。
對于 gcc 和 g++ 指令,還有其它更多細節方面的區別,當前只需要知道:
- 對于
C語言程序的編譯,我們應該使用gcc指令 - 編譯
C++程序則推薦使用g++指令
這就足夠了。
總結
以上是生活随笔為你收集整理的gcc 和 g++ 的联系和区别,使用 gcc 编译 c++的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GCC 在 Linux、Windows
- 下一篇: 2022-2028年中国阻燃纤维行业市场