gcc使用整理(2)

2021-05-27 16:48:40 字數 1346 閱讀 3123

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...