動態庫靜態庫編譯鏈結相關問題若干

2022-09-02 09:57:09 字數 1133 閱讀 2708

對於c++編譯鏈結專案依賴什麼的一直不明真相,不過通過遇到過的幾個問題還是增長了一些了解。記錄之。

庫分為靜態庫動態庫。動態庫裡面還有一種特別的是執行時有選擇載入的外掛程式,我改cocosbuilder的時候,載入的外掛程式的函式有initwithbundle什麼的,和這個有點兒聯絡。

靜態庫是會被編進去的,但是不是全體,沒有用到的符號是不會被編進去的!這個具體現象可能還平台相關,之前遇到乙個空指標crash bug,只在安卓有,windows沒有。原因是某全域性物件會在建構函式中把自己註冊到乙個模組列表中,隨後啟動後列表會呼叫所有註冊模組的startup,因為沒有呼叫相關指標初始化的函式,這個時候會出現空指標出錯。但是這個問題只在安卓出現在windows不出現,因為該全域性物件在**中沒有用到,於是編的時候壓根沒有編進去因此不會被構造出來,也就不會註冊,更不會跑到有問題的startup函式了。

動態庫裡面,只有進行了標記的符號會被匯出!之前在cocos2d裡面加了乙個新類,結果死活不行說符號找不到,我完全沒有這個概念啊,結果死活找不到原因,花了半天時間都要絕望了,最後發現是少了cc_dll,這樣標註過的符號才會被匯出來。cocos2d是dll就有這個問題,但是extension是lib,所以在extension裡加的新類就沒有這個問題。

編出來的庫需要屬性一致才能鏈起來,之前我們有個庫也是鏈結的時候死活說符號找不到,後來發現原因是乙個是multithreadeddebug,乙個是multithreadeddebugdll。

每個庫編出來都在自己的輸出目錄下面,為了避免設lib查詢路徑什麼的,可以把輸出目錄改到solution下面。

還是前面這個問題,在vs2012裡面,可以設定add reference某個庫,這樣他會自己把這個庫找到並且給你用好,不用額外設依賴library,dependency和查詢路徑。

在試驗上面這個東西的時候,發現如果某個lib用到了別的庫,那麼只要保證編譯的時候標頭檔案都在就行了,因為這時候並不會去鏈結,鏈結的那些設定只用在最後可執行的那個專案裡設好就行。但是還是應該設定依賴關係因為這樣才能保證那個庫改變了之後這個庫知道自己需要重編。

和上一點相關的,mac上曾經在乙個新庫裡面用到curl.a,結果死活找不到某幾個符號,都絕望的以為版本不對準備從源**重編了,最後觀察到那些符號都是和壓縮檔案相關,才發現原來是curl裡面用到zlib,是他們的符號找不到,所以在專案裡面還需要依賴zlib。

ld鏈結動態庫靜態庫問題

在使用redis寫c 的時候遇到的問題,安裝 redis 時make install 可以看到 mkdir p usr local include hiredis usr local lib cp a hiredis.h async.h read.h sds.h adapters usr local...

庫檔案(動態庫 靜態庫)的編譯及鏈結

庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a 和動態庫 so 特點 命名規則 linux靜態庫命名規範,必須是 lib ...

編譯靜態庫編譯動態庫

編譯靜態庫 cr標誌告訴ar將object檔案封裝 archive 我們可以使用nm s 命令來檢視.a檔案的內容 ar cr libmyhello.a hello.o 或 cvr 編譯動態庫 gcc c fpic test1.c gcc c fpic test2.c fpic告訴gcc將源 編譯成...