linux應(yīng)用基礎(chǔ)之GCC編譯器
????????在編寫單片機程序時,有如keil,iar這類IDE開發(fā)工具來幫忙對程序進行一整套的編譯,生成可執(zhí)行文件,在linux一般公司都會要求懂編譯過程,因為這開發(fā)過程中需要看懂makefile,而makefile的重要基礎(chǔ)之一就是編譯,所以GCC編譯是學(xué)習linux的必經(jīng)過程;
????????首先第一步我們要了解GCC它能干啥,GCC能幫我們把.C文件編譯成可執(zhí)行文件(也就是我們所需要的目標文件),怎么編譯的呢,編譯過程如下:
????

?????總結(jié)GCC的使用
多文件編譯:
gcc -c -o main.o main.c
gcc -c -o sub.o sub.c
gcc -o test main.o sub.o
生成靜態(tài)庫:
?首先,將代碼文件編譯成目標文件.o(StaticMath.o)
g++ -c? -o StaticMath.cpp
注意帶參數(shù)-c,否則直接編譯為可執(zhí)行文件
然后,通過ar工具將目標文件打包成.a靜態(tài)庫文件
ar -crv libstaticmath.a StaticMath.o生成靜態(tài)庫libstaticmath.a。
靜態(tài)庫的使用:
gcc -o test main.o libsub.a,不需要吧靜態(tài)庫放到板子上
生成動態(tài)庫:
gcc -c -fPIC -o sub.o sub.c
gcc -shared -o libsub.so sub.o
或者
gcc? -shared? -fPIC -o libsub.so sub.c交叉編譯需要在最后面加上 -fPIC 參數(shù)
不加-fPIC的SO庫需要進行重定位才能找到函數(shù);
加-fPIC的SO庫會在連接時生成位置虛擬列表,不需要進行位置重定位;
動態(tài)庫的使用:
gcc -o test main.o -lsub -L /libsub.so/ 所在目錄/,需要先把 libsub.so 放到 Ubuntu 的/lib 目錄
如果不想把 libsub.so 放到/lib,也可以放在某個目錄比如/a,執(zhí)行
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/a
容易碰到的編譯選項,記住選項參數(shù)就行
gcc -E -dM main.c > 1.txt //? 把所有的宏展開,存在 1.txt? 里
gcc -Wp,-MD,abc.dep -c -o main.o main.c // 生成依賴文件 abc.dep ,后面 Makefile? 會用
當我們在進行編譯的時候免不了要去鏈接庫文件,以下命令用來查詢庫文件和頭文件分別放在那個目錄下
echo 'main(){}'| gcc -E -v - //? 它會列出頭文件目錄、庫目錄(LIBRARY_PATH)
把生成的動態(tài)庫,或者靜態(tài)庫或者頭文件分別放在這個目錄下;
最后總結(jié)一下頭文件和庫文件被編譯鏈接時候查詢方式
頭文件:指定目錄查詢(一般在工具鏈中查找)或者用-I?dir
庫文件:指定目錄(一般在工具鏈中查找)或者-L?dir
運行時候.so:/lib? ?/usr/lib? 自己制定目錄(LD_LIBRARY_PATH)