link時,若liba.a依賴libb.a,若這樣寫 -lb -la,則鏈結通不過,gcc有個選項:-xlinker ,可以讓gcc在鏈結時反覆查詢依賴庫,用法 :
gcc -shared -o libxx.so xx.o -l. -xlinker "-(" -lb -la "
-)" -xlinker
這樣,包含在 -xlinker "-(" 和 "-)" -xlinker 之間的庫之間的依賴關係就不用自己操心了,linker自己知道前向回去搜尋一次。
(注: --start-group 與
--end-group 與上面的 -xlinker功能差不多,不過不推薦)
linker還有乙個選項,主要用在當用靜態庫生成動態庫時,將靜態庫完整打包到動態庫里,不過會使動態庫占用空間變大,不推薦,示例:
gcc -shared -o libxx.so xx.o -l. -wl,--whole-archive some_static_lib.a yy.o -wl,--no-whole-archive
-wl,--whole-archive
和-wl,--no-whole-archive
必須成對出現,不然出現 redefine錯誤,因為隱性的 -lc -ld -lm -lz 等都被多次完整打包,容易出現 redefine錯誤。
對於多個靜態庫,最好不要用ar將它們打包到乙個靜態庫,鏈結後的so庫有可能會存在 undefined symbol 的符號,在執行時候才會觸發錯誤(鏈結時不會出錯)。
多個靜態庫還是推薦單獨使用他們為好,即: -la -lb -lcc -ldd。
不推薦將 liba.a libb.a libcc.a libdd.a 用ar打包成乙個庫來使用,不然執行有可能出錯的。
gcc的編譯選項總結
3 arm架構專有的編譯選項 參考文獻 本文用於記錄我在學習和工作中遇到的各種gcc選項,雖然這些選項可以在gnu的手冊上查到,不過這裡做個總結,可以避免每次都去查手冊,算是乙個備忘吧。本文的內容會不斷更新擴充。選項作用 o指定輸出檔名稱 e只進行預處理 s只進行預處理 編譯 c只預處理 編譯 彙編...
MyBatis重複查詢產生的快取問題
今天遇到乙個很坑的問題,業務場景為先查詢資料,然後新增資料,之後又再次查詢資料,發現查不到最新的資料。本來以為是事物影響的,查了好多關於事物的東西,後來排查到每次查到的位址都是同乙個位址,並且控制台中列印的日誌資訊中 fetched sqlsession org.apache.ibatis.sess...
Gcc編譯時的 w W Wall選項
今天在看乙個makefile時看到了gcc w wall 這句,不明其理,專門檢視了gcc的使用手冊。w的意思是關閉編譯時的警告,也就是編譯後不顯示任何warning,因為有時在編譯之後編譯器會顯示一些例如資料轉換之類的警告,這些警告是我們平時可以忽略的。wall選項意思是編譯後顯示所有警告。w選項...