gcc -static的作用
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 用於編譯乙個程式時,會使此程式靜態編譯(把動態庫的函式和所依賴的任何的東西,都編譯進本程式),編譯好後,檔案會非常大,但是,執行時就不需要依賴任何動態庫。
嵌入式Linux第三週作業
gcc static的作用 開發乙個應用程式不可避免要使用多個第三方庫 library 預設情況下,gcc採用動態連線的方式連線第三方庫,比如指定 lpng,連線程式就會去找libpng.so。gcc提供了乙個 static引數,可以改變gcc預設的連線方式,這個 static選項是個大殺器,指定了...
《嵌入式程式設計》第三週學習總結
教材學習內容總結 1.交叉開發工具鏈軟體 1 將工具鏈加入到path中 path,檢視 usr bin 第一種 export path path usr local arm gcc 3.4.6 glibc 2.3.6 bin 這種方法關掉客戶端就沒了 第二種 新增到下面三個檔案其一均可 etc pr...
嵌入式課程作業 第二週
bin 普通使用者命令 sbin 管理員命令 etc 存放的是系統中的所有配置檔案 dev 系統中所有裝置檔案 home 普通使用者的工作目錄 root root使用者的工作目錄 usr 存放的是系統中安裝的軟體 boot 包含引導linux的重要檔案 lib 系統的庫檔案,有點像windows的p...