動態庫呼叫靜態庫崩潰,如何確定程式呼叫了動態庫或者靜態庫

2022-08-10 05:52:11 字數 2725 閱讀 3448

1樓:匿名使用者

靜態庫與動態庫相互呼叫

測試場景,test,lib1,lib2,dll1,dll2,分為下面四種情況:

1、test->lib1->lib2

lib1編譯自己的**,對lib2的部分,只需要lib2的標頭檔案,對lib2的**實現,使用佔位符關聯。

生成test連線的時候,把lib1的**實現包含進來,再遞迴,把lib1中關聯lib2的**實現也包含進來。

執行test的時候,不再需要lib1和lib2。

2、test->lib1->dll2

lib1編譯自己的**,對dll2的部分,只需要dll2的標頭檔案,對dll2的**實現,使用佔位符關聯。

生成test連線的時候,把lib1的**實現包含進來,但是,dll2中的**不包含進來。

執行test的時候,不需要lib1,但是需要dll2【不需要dll的lib檔案】

3、test->dll1->lib2

dll1編譯自己的**,對lib2的部分,需要lib2的標頭檔案和實現,即lib2,把lib2的**實現包含到dll1中

生成test連線的時候,dll1中的**不包含進來,並且不再需要lib2。

【可以這樣測試,生成lib2,生成dll1,生成test.exe,刪除lib2,刪除test.exe,再生成test.

exe,可以生成成功。說明生成test.exe,連線的時候根本不需要lib2,。

也就是說,靜態庫會被連線到動態庫或者exe中,但是不會被連線到其他的靜態庫中】

執行test的時候,需要dll1,但是不需要lib2

4、test->dll1->dll2

dll1編譯自己的**,對dll2的部分,需要dll2的標頭檔案和lib檔案,對dll2的**實現,使用佔位符關聯。

生成test連線的時候,test需要dll1的lib,dll1需要dll2的lib,但是**實現都不會包含在test中。

執行test的時候,需要dll1和dll2【不需要他們的lib】

2樓:理工愛好者

多次呼叫有問題,是不是每次呼叫後都沒釋放資源呢?如果資源佔用大,有可能出現程式崩潰。

宿主程式crash與lua是動態庫還是靜態庫有關

3樓:匿名使用者

在專案中我們用了lua作為指令碼擴充套件支援,lua是以靜態庫的形式編譯進專案程式中的,但應用程式執行不了多久,就會宕在lua函式luam_realloc_中。在我仔細檢視了呼叫lua指令碼的地方,並沒有發現任何的可疑之處,而且以前將lua模組與應用程式模組直接放在同一個專案中的時候並沒有出現過類似情況。故認為是專案中的其它**寫得有問題導致記憶體分配失敗,由於專案**量比較大,為了儘早出版本,在網上查了一下此情況,發現可能是lua模組的靜態庫連線有問題,但是感覺不應該啊!

抱著試一試的想法,把lua模組以動態連結庫的形式呼叫,執行程式,發現居然一切正常

如何確定程式呼叫了動態庫或者靜態庫

4樓:匿名使用者

可以得出第一個結論:都為靜態連結庫,有同名函式參與情況下,連結會出現符號多次定義的錯誤!

兩個動態庫

再來看看動態連結庫,同樣的liba libb 生成動態連結庫

測試主程式不修改 ! 還是為:

這種編譯方式叫做動態庫的隱式呼叫, 如果你刪除一個liba.so , 執行a.out 會出現不能找到動態庫的錯誤.

這種情況也可以稱為 載入時連結! 靜態庫屬於編譯時連結!

可以得出第二個結論: 若都為動態庫,並且進行隱式呼叫,輸出結果和動態庫的順序有關.

再繼續看看動態載入動態庫.

修改測試主程式

同樣可以得出結論,動態連結庫如果不加庫連選項 ,函式呼叫是正確的 加庫路徑,會以庫的路徑順序為主! 左邊覆蓋右邊. 而且當只連結其中一個時 也生效

為什麼呼叫c庫中庫檔案要有標頭檔案,而呼叫自己寫的靜態庫和動態庫就 不需要包含匯出檔案的標頭檔案

5樓:匿名使用者

什麼時候需要標頭檔案,是這樣的:

編譯程式如果遇到一個函式呼叫,那麼它就要查這個函式是否給出了呼叫的格式,假設這個函式是在呼叫程式前面寫出的,那麼經過編譯程式的編譯,編譯程式已經知道了函式呼叫規則格式,就不需要再說明了,比如:由於fun函式體寫在main函式之前,無需說明即可呼叫

void fun(int a,int n)void main()

如果函式寫在呼叫程式之後,編譯程式在編譯這個呼叫語句時,沒有編譯過這個函式,那就需要在前面事先說明一下了:

void fun(int a,int n); //函式頭說明語句void main()

void fun(int a,int n)那麼由於標準c函式庫的頭寫到標頭檔案中,你要使用必須加上這些函式的呼叫格式說明,所以要加include語句,你的函式其實也是一樣的。

6樓:匿名使用者

我也遇到同樣的問題:呼叫c庫裡的檔案,需要包含其標頭檔案,呼叫自己定義的庫檔案,就不需要包含對應的標頭檔案,為什麼??

動態庫能不能使用靜態庫

7樓:彈出一片天

我們通常把一些公用函式製作成函式庫,供其它程式使用。

函式庫分為靜態庫和動態庫兩種。

靜態庫在程式編譯時會被連線到目標**中,程式執行時將不再需要該靜態庫。

動態庫在程式編譯時並不會被連線到目標**中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。

什麼是靜態連結庫?什麼是動態連結庫?他們有什麼區別

一 動態連結庫的概念 動態連結庫 dynamic link library,縮寫為dll 是一個可以被其它應用程式共享的程式模組,其中封裝了一些可以被共享的例程和資源。動態連結庫檔案的副檔名一般是dll,也有可能是drv sys和fon,它和可執行檔案 exe 非常類似,區別在於dll中雖然包含了可...

常用動態連結庫的dll有哪些,常用動態連結庫的DLL有哪些?

哥們,你好歹給個範圍,windows裡的dll一堆堆,很多程式,軟體都有自己的dll,我自己寫個軟體也可以生成很多dll,哪些是你認為常用的 動態連結庫 dll,即 dynamic link library 是可執行的模組,但它沒有自己的堆疊,必須在呼叫動態連結庫函式的程式 環境下執行。動態連結庫不...

如何區分靜態路由動態路由

在一個路由器中,可同時配置靜態路由和一種或多種動態路由。它們各自維護的路由表都提供給 程式,但這些路由表的表項間可能會發生衝突。這種衝突可通過配置各路由表的優先順序來解決。通常靜態路由具有預設的最高優先順序,當其它路由表表項與它矛盾時,均按靜態路由 是的 可以通過不同的方法去配置,動態的就是在路由上...