gcc和g++的區別
誤區一:gcc只能編譯c**,g++只能編譯c++**。
兩者都可以。但是請注意:
1. 字尾為.c的,gcc把它當作c語言,而g++當作是c++程式。字尾為.cpp的一樣當成c++。
2. 編譯階段,g++會呼叫gcc,對於c++**,兩者是等價的。但是因為gcc命令不能自動和c++程式使用的庫鏈結,所以通常用g++完成鏈結。為了統一,乾脆用g++。
誤區四:extern "c"與gcc、g++有關係
實際上並無關係,都是以c的命名方式來為symbol命名。
編譯簡單的c程式
假定**存為「hello.c」,要用gcc編譯該檔案,使用下面的命令:
gcc -g -wall hello.c -o hello
該命令將檔案hello.c中的**編譯為機器碼並儲存在可執行檔案hello中。機器碼的檔名是通過-o選項指定的。選項-wall開啟編譯器幾乎所有常用的警告。選項-g表示在生成的目標檔案中帶除錯資訊。
編譯多個原始檔
例子將程式helloworld分割成三個檔案hello.c、hello_fn.c、hello.h。要用gcc編譯以上原始檔,使用下面的命令:
gcc -wall hello.c hello_fn.c -o newhello
注意到頭檔案hello.h並未在命令列中指定,原始檔中的#include "hello.h"使得編譯器自動將其包含到合適的位置。
簡單的makefile檔案
cc=gcc
cflags=-wall
hello: hello.o hello_fn.o
clean:
rm -f hello hello.o hello_fn.o
鏈結外部庫
庫是預編譯的目標檔案的集合,它們可以被鏈結程序式。靜態庫以後綴.a的存檔檔案。標準系統庫可在目錄/usr/lib與/lib中找到。
比如,在類unix系統中,c語言的數學庫一般儲存為檔案/usr/lib/libm.a。該庫中函式的原型宣告在標頭檔案/usr/include/math.h中。
在乙個呼叫數學庫libm.a中sin函式的例子,嘗試單獨從該檔案生成乙個可執行檔案將導致乙個鏈結階段的錯誤。函式sin未在本程式中定義也不在預設庫libc.a中。為使編譯器能將sin鏈結進主程式,我們需要提供數學庫libm.a,乙個容易想到但比較麻煩的做法是在命令列中顯式地指定它 gcc -wall calc.c /usr/lib/libm.a -o calc。為了避免在命令列中指定長長的路徑,編譯器為鏈結函式庫提供了快捷的選項-l。例如 gcc -wall calc.c -lm -o calc。與我們上面指定庫全路徑的命令等價。一般,-lname使鏈結器嘗試鏈結系統庫目錄中的函式庫檔案libname.a。
gcc使用與分析2
gcc使用與分析1 gcc v o hello hello.o 用來顯示編譯過程 顯示編譯過程會發現許多crt1.o crti.o crtbegin.o crtend.o crtn.o這樣的obj檔案,這些檔案是gcc為了讓可執行檔案可以在linux平台執行加的系統標準啟動檔案,對於一般應用程式,這...
GCC命令選項 整理
由於gcc命令選項太多,以下只列部分常用選項 按a z排列 ansi 支援ansi iso c的標準語法,取消gnu的語法擴充套件中與標準有衝突部分 但這一項並不能保證生成ansi相容 b machine 在有的時候,gcc編譯器編譯出來的目標 並不是在執行這個編譯動作的機器上執行而是另外一台機器,...
重灌gcc版本的錯誤整理
注 重新安裝前系統中要保留乙個gcc。error libmpfc.so.1 no such file or directory 原因 libmpfc.so和libmpfc.so.1都是鏈結到旁邊的libmpfc.so.1.2.2,為什麼會找不到呢?解決 刪掉兩個鏈結檔案,複製兩個libmpfc.so...