gcc使用入門

2021-06-12 10:49:28 字數 2873 閱讀 2147

$ gcc -wall hello.c -o hello
一定加上-wall顯示警告資訊,並修改**重複編譯直到消除所有warning(c/c++是很不安全的)。

$ gcc -wall main.c hello_fn.c -o newhello
無需指定.h檔案

$ gcc -wall -c main.c

$ gcc -wall -c hello_fn.c

此處不需加-o選項,會根據filename.c自動生成對應的filename.o檔案

$ gcc main.o hello_fn.o -o hello
鏈結時無需加-wall選項

傳統編譯器、鏈結器是從指定.o檔案中從左到右搜尋外部函式的。這要求定義函式的目標檔案要出現在呼叫函式的目標檔案之後

$ gcc main.o hello_fn.o -o hello (correct order)

$ cc hello_fn.o main.o -o hello (incorrect order)

main.o: in function 『main』:

main.o(.text+0xf): undefined reference to 『hello』

現在很多編譯器沒有順序的約束,但為了保證可移植性,最好還是按照上述順序寫目標檔案。

可以在編譯時直接指定要鏈結的庫檔案

$ gcc -wall calc.c /usr/lib/libm.a -o calc
可用如下簡略形式避免輸入長檔案路徑

$ gcc -wall calc.c -lm -o calc

注意:鏈結外部庫時也存在1.3.2中提到的順序問題

預設情況gcc會從如下目錄中順序搜尋標頭檔案和庫檔案

/usr/local/include/

/usr/include/

/usr/local/lib/

/usr/lib/

當引用第三方庫時,標頭檔案和庫檔案常常不在以上目錄中。此時需用如下方法指定搜尋路徑

$ gcc -wall -i/opt/gdbm-1.8.3/include -l/opt/gdbm-1.8.3/lib dbmain.c -lgdbm
可通過編輯.bash_profile在使用者登入時自動設定環境變數

$ c_include_path=$home/usr/include

$ export c_include_path

$ cplus_include_path=$home/usr/include

$ export cplus_include_path

$ library_path=$home/usr/lib

$ export library_path

此時搜尋順序是:-i或-l指定的路徑、環境變數中的路徑、gcc預設搜尋路徑

通過設定環境變數

$ c_include_path=.:/opt/gdbm-1.8.3/include:/net/include

$ library_path=.:/opt/gdbm-1.8.3/lib:/net/lib

通過命令列

$ gcc -i. -i/opt/gdbm-1.8.3/include -i/net/include -l. -l/opt/gdbm-1.8.3/lib -l/net/lib .....
此時搜尋順序同1.5.2

大部分系統中gcc編譯器預設使用動態庫,當用-lname選項時,若libname.so與libname.a同時存在,gcc優先使用.so檔案。

依賴於動態庫的可執行檔案執行時同樣存在乙個搜尋路徑的問題。一般系統預設從/usr/lib /usr/local/lib中搜尋動態庫,若找不到則會出現如下的類似錯誤

./a.out: error while loading shared libraries: libgdbm.so.3: 

cannot open shared object file: no such file or directory

需要把動態庫檔案加到載入路徑中,依賴於動態庫的可執行檔案才能執行,方法是修改環境變數ld_library_path(mac下是dyld_library_path)

$ ld_library_path=/opt/gdbm-1.8.3/lib

$ export ld_library_path

同樣可將此指令碼加到.bash_profile中在使用者登入時自動初始化該環境變數

系統管理員可通過修改/etc/profile來修改所有使用者的環境變數,gnu系統中還可修改/etc/ld.so.conf

若要強制使用靜態庫,可通過gcc的-static選項實現

$ gcc -wall -static -i/opt/gdbm-1.8.3/include/ -l/opt/gdbm-1.8.3/lib/ dbmain.c -lgdbm
也可通過直接給定庫檔案的完整路徑、完整檔名來指定使用動態庫還是靜態庫

$ gcc -wall -i/opt/gdbm-1.8.3/include dbmain.c /opt/gdbm-1.8.3/lib/libgdbm.a使用靜態庫
$ gcc -wall -i/opt/gdbm-1.8.3/include dbmain.c /opt/gdbm-1.8.3/lib/libgdbm.so使用動態庫

gcc使用大全

第一步 是進行預編譯,使用 e 引數可以讓gcc 在預處理結束後停止編譯過程 gcc e hello.c o hello.i 預處理的巨集定義插入到hello.i 中 第二步 是將hello.i 編譯為目標 這可以通過使用 c 引數來完成 gcc c hello.i o hello.o 也可以通過原...

gcc使用初步

unix linux系統支援眾多的程式語言,而 c語言是其宿主語言。所以,在 unix linux 環境下,c語言用的做好,也用的最多。c 是擴充套件的 c語言,它在 c語言的基礎上成功地實現了物件導向程式設計的思想,提供了從 c語言轉換到更高程式設計的理想途徑。目前,linux 平台上最常用的 c...

gcc基本使用

centos 版本的可直接執行指令 yum install gcc gnu cc 通常稱為gcc 是gnu羨專案的編譯器,它能夠編譯c c 語言編寫程式。gcc是區分拓展名的,c檔案,gcc就會用c語言的規範去編譯,cpp的檔案,gcc就會用c 語言的規範去編譯。引數含義 o filename 輸出...