GCC的一些基本用法_待補充

GCC: GNU C Compiler; GNU Compiler Collection

常用基本命令

gcc test.c -o test

上述編譯過程分爲

預處理 Preprocessing

gcc -E test.c -o test.i 或 gcc -E test.c

gcc的-E選項,可以讓編譯器在預處理後停止,並輸出預處理結果。

編譯 Compilation

gcc -S test.i -o test.s

gcc的-S選項,表示在程序編譯期間,在生成彙編代碼後,停止,-o輸出彙編代碼文件。

彙編 Assembly

gcc -c test.s -o test.o

連接 Linking

gcc test.o -o test

將程序的目標文件與所需的所有附加的目標文件連接起來,最終生成可執行文件。附加的目標文件包括靜態連接庫和動態連接庫。

編譯多個文件

如果程序多個源文件,並且最終生成可執行文件test

gcc test1.c test2.c -o test

若同時處理的文件不止一個,那麼GCC依舊會按照預處理,編譯,鏈接的過程進行:

上述命令相當於依次執行

gcc -c test1.c -o test1.o
gcc -c test2.c -o test2.o
gcc test1.o test2.o -o test

Debug

gcc -Wall illcode.c -o illcode

使用 -Wall 能夠使GCC產生儘可能多的警告信息。

gcc -Werror test.c -o test

使用 -Werror 可以讓GCC在所有產生警告的地方停止編譯。

鏈接庫文件

在linux中,大多數函數的頭文件會被放到 /usr/include 中,庫文件一般放在 /usr/lib中。

在linux中,庫文件分爲兩類,分別是 動態鏈接庫 .so ,和 靜態鏈接庫 .a。兩者的區別在於程序執行時所需的代碼是在運行時動態加載的,還是在編譯時靜態加載的。

編譯成可執行文件

gcc –c –I /usr/dev/mysql/include test.c –o test.o

鏈接

gcc –L /usr/dev/mysql/lib –lmysqlclient test.o –o test

默認情況下,GCC鏈接時優先使用靜態鏈接庫,只有在動態鏈接庫不存在的時候才使用靜態鏈接庫,如果需要強制使用靜態鏈接庫,那麼加入 -static

靜態庫鏈接時搜索路徑順序:

  1. ld會去找GCC命令中的參數-L
  2. 再找gcc的環境變量LIBRARY_PATH
  3. 再找內定目錄 /lib /usr/lib /usr/local/lib 這是當初compile gcc時寫在程序內的

動態鏈接時、執行時搜索路徑順序:

  1. 編譯目標代碼時指定的動態庫搜索路徑
  2. 環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑
  3. 配置文件/etc/ld.so.conf中指定的動態庫搜索路徑
  4. 默認的動態庫搜索路徑/lib
  5. 默認的動態庫搜索路徑/usr/lib

有關環境變量:

LIBRARY_PATH 環境變量:指定程序靜態鏈接庫文件搜索路徑

LD_LIBRARY_PATH 環境變量:指定程序動態鏈接庫文件搜索路徑


Reference

https://www.cnblogs.com/ggjucheng/archive/2011/12/14/2287738.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章