Linux環境下GNU, GCC, G 編譯器

2021-07-30 11:24:13 字數 2259 閱讀 9520

一,gnu

gnu是「gnu 's not unix」的遞迴縮寫, stallman宣布gnu應當發音為guh-noo(革奴)以避免與new這個單詞混淆(注:gnu在英文中原意為非洲牛羚,發音與new相同)

為保證gnu軟體可以自由地「使用、複製、修改和發布」,所有gnu軟體都在乙份在禁止其他人新增任何限制的情況下授權所有權利給任何人的協議條款,gnu通用公共許可證(gnu general public license,gpl)。這個就是被稱為「反版權」(或稱copyleft)的概念。

gun可以理解為一種linux規範。

二,gcc與g++的區別

gcc和g++都是gnu(組織)的乙個編譯器。對它們的認識有很多誤區:

【誤區一】gcc只能編譯c**,g++只能編譯c++**

兩者都可以,但是請注意:

1.字尾為.c的,gcc把它當作是c程式,而g++當作是c++程式;字尾為.cpp的,兩者都會認為是c++程式,注意,雖然c++是c的超集,但是兩者對語法的要求是有區別的,例如:

#include

int main(int argc, char* argv)

int printstring(char* string)

如果按照c的語法規則,ok,沒問題,但是,一旦把字尾改為cpp,立刻報三個錯:「printstring未定義」;

「cannot convert `char**' to `char*」;

」return-statement with no value「;

分別對應前面紅色標註的部分。可見c++的語法規則更加嚴謹一些。

2.編譯階段,g++會呼叫gcc,對於c++**,兩者是等價的,但是因為gcc命令不能自動和c++程式使用的庫聯接,所以通常用g++來完成鏈結,為了統一起見,乾脆編譯/鏈結統統用g++了,這就給人一種錯覺,好像cpp程式只能用g++似的。

【誤區二】:gcc不會定義__cplusplus巨集,而g++會

實際上,這個巨集只是標誌著編譯器將會把**按c還是c++語法來解釋,如上所述,如果字尾為.c,並且採用gcc編譯器,則該巨集就是未定義的,否則,就是已定義。

【誤區三】:編譯只能用gcc,鏈結只能用g++

嚴格來說,這句話不算錯誤,但是它混淆了概念,應該這樣說:編譯可以用gcc/g++,而鏈結可以用g++或者gcc -lstdc++。因為gcc命令不能自動和c++程式使用的庫聯接,所以通常使用g++來完成聯接。但在編譯階段,g++會自動呼叫gcc,二者等價。

【誤區四】:extern "c"與gcc/g++有關係

實際上並無關係,無論是gcc還是g++,用extern "c"時,都是以c的命名方式來為symbol命名,否則,都以c++方式命名。試驗如下:

me.h:

extern "c" void cppprintf(void);

me.cpp:

#include

#include "me.h"

using namespace std;

void cppprintf(void)

1. 先給me.h加上extern "c",看用gcc和g++命名有什麼不同

[root@root g++]# g++ -s me.cpp

[root@root g++]# less me.s

.globl _z9cppprintfv //注意此函式的命名

.type cppprintf, @function

[root@root gcc]# gcc -s me.cpp

[root@root gcc]# less me.s

.globl _z9cppprintfv //注意此函式的命名

.type cppprintf, @function

完全相同!

2. 去掉me.h中extern "c",看用gcc和g++命名有什麼不同

[root@root gcc]# gcc -s me.cpp

[root@root gcc]# less me.s

.globl _z9cppprintfv //注意此函式的命名

.type _z9cppprintfv, @function

[root@root g++]# g++ -s me.cpp

[root@root g++]# less me.s

.globl _z9cppprintfv //注意此函式的命名

.type _z9cppprintfv, @function

完全相同!

可見extern "c"與採用gcc/g++並無關係,以上的試驗還間接的印證了前面的說法:在編譯階段,g++是呼叫gcc的。

Linux下Apache Python環境搭建

一.環境說明 1.系統環境 centos release 5.4 final 2.軟體版本 apache 2.2.3 python 2.6.6 mod python 3.3.1 二.安裝apache 安裝過程略。2.如果使用系統自帶的apache,則需要檢視系統是否安裝httpd devel包。操作...

Linux環境下FTP環境搭建

目錄 一 安裝 ftp 服務 二 檢視當前 ftp 服務狀態 三 通過 service 的方式來 啟動 檢視 停止和重啟 ftp服務 四 通過指令碼的方式來 啟動 檢視 停止和重啟 ftp服務 root localhost data rpm q vsftpd 檢查ftp服務是否安裝,如果沒有安裝則安...

Linux操作環境下配置MMIX環境

mmix用途 高德納寫的 計算機程式設計藝術 使用 mmixal 來編寫 解釋演算法。環境 ubuntu 桌面版18.04。1,建立mmix資料夾並切入該資料夾中 mkdir mmix cd mmix wget3,解壓 tar xf mmix.tar.gz4,安裝 make doc make all...