#gcc -static的作用
開發乙個應用程式不可避免要使用多個第三方庫(library).
預設情況下,gcc採用動態連線的方式連線第三方庫,比如指定-lpng,連線程式就會去找libpng.so。
gcc提供了乙個-static引數,可以改變gcc預設的連線方式,這個-static選項是個大殺器,指定了這個選項,gcc在連線時對專案所有的依賴庫都嘗試去搜尋名為lib.a的靜態庫檔案,完成靜態連線,如果找不到就報錯了。這裡指的所有是不僅指我們常用的第三方庫比如jpeg,png,opencv,zlib,…,還包括gcc編譯器自帶的庫libgcc,libstdc++,libc,libm…,總之就是linux kernal之外的所有庫。而且還要包括所有被間接引用的第三方庫,比如png這個庫在編譯時還用到了zlib,那麼靜態連線png的時候,就要帶上zlib的庫:-lpng -lz,
這可麻煩大了,要把這些東西全靜態連線,要占用很大的記憶體,這種全靜態連線有啥用處呢?也有用,就是你的程式自帶乾糧,只需要乙個linux kernal就能跑了。
但是實際應用中,我們絕大多數應用場景不需要這麼做,即使在嵌入式系統中也不一定必要,尤其是嵌入式系統的儲存容量受限,這麼乙隻大象裝都裝不下。所以我們大多數情況下需要有選擇的進行靜態編譯,-static並不適合。
如何有選擇的進行靜態編譯呢?
最簡單的方式直接在連線引數中以全路徑指定連線庫就好了:your/path/lib.a
但這種形式對管理結構簡單而且自己寫makefile的小型專案還好,當乙個專案結構複雜,有時需要靜態連線有時需要動態連線,這種頻繁的修改編譯指令碼的方式,可維護性就太差了。
-bstatic
gnu的連線程式ld提供了乙個-bstatic選項用於對指定的庫靜態連線,大意就是-bstatic引數指定對跟在它後面的所有庫執行靜態連線,如下就指定ldflags對png這個庫靜態連線,ld會自動去搜尋libpng.a
-bstatic -lpng -lz
-l:filename
如果-l:filename格式指定乙個檔名,連線程式直接去找這個檔名了,不會再像使用-lname時將name擴充套件成lib.a格式的檔名.
所以使用 -l:libpng.a這樣的形式來指定連線庫,就指定了靜態連線png庫。
當然如果庫的位置不在gcc預設搜尋路徑中,要用-l引數另外指定搜尋庫的路徑,否則連線程式不知道該從**找到filename。
-l/your/library/path -l:libmylib.a
嵌入式課程作業 第三週
gcc static的作用 gcc提供了乙個 static引數,可以改變gcc預設的連線方式 指定了這個 static選項,gcc在連線時對專案所有的依賴庫都嘗試去搜尋名為lib.a的靜態庫檔案,完成靜態連線,如果找不到就報錯了。這裡指的所有是不僅指我們常用的第三方庫比如jpeg,png,openc...
《嵌入式程式設計》第三週學習總結
教材學習內容總結 1.交叉開發工具鏈軟體 1 將工具鏈加入到path中 path,檢視 usr bin 第一種 export path path usr local arm gcc 3.4.6 glibc 2.3.6 bin 這種方法關掉客戶端就沒了 第二種 新增到下面三個檔案其一均可 etc pr...
第三週作業
實驗作業 1.輸入課本各個例題,除錯執行程式,並分析程式,將每乙個程式改寫2到3個版本,自己分析程式結果,然後再除錯執行,核對分析結果的對錯。2.編寫程式輸入乙個三角形的三條邊,計算其面積和周長 3.編寫程式計算並輸出課本本章習題3表示式的值並分析結果。4.編寫乙個程式,輸入乙個一元二次方程的三個係...