當前位置:首頁 » 編程軟體 » 靜態編譯程序可以使用動態庫嗎

靜態編譯程序可以使用動態庫嗎

發布時間: 2022-02-13 20:29:50

1. 動態鏈接庫,靜態鏈接庫和可執行文件的區別是什麼

二、動態鏈接庫的優點 1. 共享代碼、資源和數據 使用DLL的主要目的就是為了共享代碼,DLL的代碼可以被所有的Windows應用程序共享。 2. 隱藏實現的細節 DLL中的常式可以被應用程序訪問,而應用程序並不知道這些常式的細節。 3. 拓展開發工具如Delphi的功能 由於DLL是與語言無關的,因此可以創建一個DLL,被C++、VB或任何支持動態鏈接庫的語言調用。這樣如果一種語言存在不足,就可以通過訪問另一種語言創建的DLL來彌補。 三、動態鏈接庫的實現方法 1. Load-time Dynamic Linking 這種用法的前提是在編譯之前已經明確知道要調用DLL中的哪幾個函數,編譯時在目標文件中只保留必要的鏈接信息,而不含DLL函數的代碼;當程序執行時,利用鏈接信息載入DLL函數代碼並在內存中將其鏈接入調用程序的執行空間中,其主要目的是便於代碼共享。 2. Run-time Dynamic Linking 教你認識動態鏈接庫DLL文件 DLL是Dynamic Link Library的縮寫,意為動態鏈接庫。在Windows中,許多應用程序並不是一個完整的可執行文件,它們被分割成一些相對獨立的動態鏈接庫,即DLL文件,放置於系統中。當我們執行某一個程序時,相應的DLL文件就會被調用。一個應用程序可有多個DLL文件,一個DLL文件也可能被幾個應用程序所共用,這樣的DLL文件被稱為共享DLL文件。DLL文件一般被存放在C:WindowsSystem目錄下。 右鍵單擊該應用程序並選擇快捷菜單中的「快速查看」命令,在隨後出現的「快速查看」窗口的「引入表」一欄中你將看到其使用DLL文件的情況。 運行Regedit,進入HKEY_LOCAL_- VersionSharedDlls子鍵查看,其右邊窗口中就顯示了所有DLL文件及其相關數據,其中數據右邊小括弧內的數字就說明了被幾個程序使用,(2)表示被兩個程序使用,(0)則表示無程序使用,可以將其刪除。 有時在卸載文件時會提醒你刪除某個DLL文件可能會影響其他應用程序的運行。所以當你卸載軟體時,就有可能誤刪共享的DLL文件。一旦出現了丟失DLL文件的情況,如果你能確定其名稱,可以在Sysbckup(系統備份文件夾)中找到該DLL文件,將其復制到System文件夾中。如果這樣不行,在電腦啟動時又總是出現「***dll文件丟失……」的提示框,你可以在「開始/運行」中運行Msconfig,進入系統配置實用程序對話框以後,單擊選擇「System.ini」標簽,找出提示丟失的DLL文件,使其不被選中,這樣開機時就不會出現錯誤提示了。 dll文件與lib文件的關系 (1)lib是編譯時需要的,dll是運行時需要的。 如果要完成源代碼的編譯,有lib就夠了。 如果也使動態連接的程序運行起來,有dll就夠了。 在開發和調試階段,當然最好都有。 (2)一般的動態庫程序有lib文件和dll文件。lib文件是必須在編譯期就連接到應用程序中的,而dll文件是運行期才會被調用的。如果有dll文件,那麼對應的lib文件一般是一些索引信息,具體的實現在dll文件中。如果只有lib文件,那麼這個lib文件是靜態編譯出來的,索引和實現都在其中。靜態編譯的lib文件有好處:給用戶安裝時就不需要再掛動態庫了。但也有缺點,就是導致應用程序比較大,而且失去了動態庫的靈活性,在版本升級時,同時要發布新的應用程序才行。 (3)在動態庫的情況下,有兩個文件,一個是引入庫(.LIB)文件,一個是DLL文件,引入庫文件包含被DLL導出的函數的名稱和位置,DLL包含實際的函數和數據,應用程序使用LIB文件鏈接到所需要使用的DLL文件,庫中的函數和數據並不復制到可執行文件中,因此在應用程序的可執行文件中,存放的不是被調用的函數代碼,而是DLL中所要調用的函數的內存地址,這樣當一個或多個應用程序運行是再把程序代碼和被調用的函數代碼鏈接起來,從而節省了內存資源。從上面的說明可以看出,DLL和.LIB文件必須隨應用程序一起發行,否則應用程序將會產生錯誤

2. 已經將mfc動態鏈接庫以靜態編譯的方式編譯,為什麼程序還會提示缺少dll

如果丟失,按我說的試試
第一、修復
使用騰訊電腦管家,點開電腦診所之後,搜缺失的dll文件,會自動篩選出來,然後你只需要點立即修復即可!
第二、下載安裝
根據你的系統下載(比如XP或w7),然後點開你的系統盤,點開windows這個文件夾再點開system32這個文件夾,把下載下來的dll文件復制進來就可

3. 怎樣將自己做的動態鏈接庫「靜態」編譯到可執行文件里

舉例文件:add.c
gcc -fPIC -c add.c /生成.o文件
gcc -shared add.o -o libmath.so /載入add.o到math動態庫
gcc test.c -L. -Lmath /test.c 為主程序
另外;配置動態庫載入器環境變數:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

4. lib文件靜態庫和dll文件動態連接庫有什麼不同,分別有什麼作用!在編譯時各自起什麼作用

簡單來說 靜態庫 編譯完 之後 就一個光光 exe
動態庫編譯完 之後 是要 一個exe 和這個dll同時在 才能運行。
好處?dll可以動態載入,也可以被多個程序調用,
lib庫 存在版本必須一致的問題,例如2008的代碼 連接的時候 必須要連接 2008編譯出來的lib庫,
而dll 或許 不需要這么強制對應。

5. 靜態編譯和動態編譯有何不同

靜態編譯就是把庫函數編譯到你的程序里 這樣編譯的好處是 可以適應不同的平台 如果你是用window系統的話不建議用靜態編譯 因為這樣會使你的代碼量增大
動態編譯就是不把庫函數編譯到你的程序里

6. 編譯成靜態庫好呢還是動態庫好

都可以用

7. 簡述gcc編譯時使用靜態庫和動態庫的區別

函數庫分為靜態庫和動態庫兩
種。靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。動態
庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運
行時還需要動態庫存在。

8. 動態庫和靜態庫的區別

兩者區別:
a,靜態庫的使用需要:
1 包含一個對應的頭文件告知編譯器lib文件裡面的具體內容
2 設置lib文件允許編譯器去查找已經編譯好的二進制代碼

b,動態庫的使用:
程序運行時需要載入動態庫,對動態庫有依賴性,需要手動加入動態庫

c,依賴性:
靜態鏈接表示靜態性,在編譯鏈接之後, lib庫中需要的資源已經在可執行程序中了, 也就是靜態存在,沒有依賴性了
動態,就是實時性,在運行的時候載入需要的資源,那麼必須在運行的時候提供 需要的 動態庫,有依賴性, 運行時候沒有找到庫就不能運行了

d,區別:
簡單講,靜態庫就是直接將需要的代碼連接進可執行程序;動態庫就是在需要調用其中的函數時,根據函數映射表找到該函數然後調入堆棧執行。
做成靜態庫可執行文件本身比較大,但不必附帶動態庫
做成動態庫可執行文件本身比較小,但需要附帶動態庫
鏈接靜態庫,編譯的可執行文件比較大,當然可以用strip命令精簡一下(如:strip libtest.a),但還是要比鏈接動態庫的可執行文件大。程序運行時間速度稍微快一點。
靜態庫是程序運行的時候已經調入內存,不管有沒有調用,都會在內存里頭。靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。
其在編譯程序時若鏈接,程序運行時會在系統指定的路徑下搜索,然後導入內存,程序一般執行時間稍微長一點,但編譯的可執行文件比較小;動態庫是程序運行的時候需要調用的時候才裝入內存,不需要的時候是不會裝入內存的。
動態庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運行時還需要動態庫存在。

動態鏈接庫的特點與優勢

首先讓我們來看一下,把庫函數推遲到程序運行時期載入的好處:

1. 可以實現進程之間的資源共享。

什麼概念呢?就是說,某個程序的在運行中要調用某個動態鏈接庫函數的時候,操作系統首先會查看所有正在運行的程序,看在內存里是否已有此庫函數的拷貝了。如果有,則讓其共享那一個拷貝;只有沒有才鏈接載入。這樣的模式雖然會帶來一些「動態鏈接」額外的開銷,卻大大的節省了系統的內存資源。C的標准庫就是動態鏈接庫,也就是說系統中所有運行的程序共享著同一個C標准庫的代碼段。

2. 將一些程序升級變得簡單。用戶只需要升級動態鏈接庫,而無需重新編譯鏈接其他原有的代碼就可以完成整個程序的升級。Windows 就是一個很好的例子。

3. 甚至可以真正坐到鏈接載入完全由程序員在程序代碼中控制。

程序員在編寫程序的時候,可以明確的指明什麼時候或者什麼情況下,鏈接載入哪個動態鏈接庫函數。你可以有一個相當大的軟體,但每次運行的時候,由於不同的操作需求,只有一小部分程序被載入內存。所有的函數本著「有需求才調入」的原則,於是大大節省了系統資源。比如現在的軟體通常都能打開若干種不同類型的文件,這些讀寫操作通常都用動態鏈接庫來實現。在一次運行當中,一般只有一種類型的文件將會被打開。所以直到程序知道文件的類型以後再載入相應的讀寫函數,而不是一開始就將所有的讀寫函數都載入,然後才發覺在整個程序中根本沒有用到它們。

靜態庫:在編譯的時候載入生成目標文件,在運行時不用載入庫,在運行時對庫沒有依賴性。
動態庫:在目標文件運行時載入,手動載入,且對庫有依賴性。

具體在開發中用到哪種庫,我覺得還是根據實際的內存大小,ROM大小,運行的速度等綜合考慮。

9. 動態鏈接,靜態鏈接 動態編譯,靜態編譯 動態鏈接庫,靜態鏈接庫 這些兩兩間的區別是什麼呢

有點兒亂……,分數少簡單扼要的說說吧。
————————————
首先,傳統的編譯,也就是靜態編譯是把 源文件 翻譯成目標文件,這個是一次性過程,也就是你所謂的靜態編譯。
後來的Java和.NET等語言,首先編譯成中間形式,然後運行過程中根據需要編譯成本地代碼(注意這個過程不是一次性的,下次運行重新編譯),這個就是JIT(即時編譯)技術,從即時編譯發展出了動態編譯技術
————————————
(傳統的)編譯完成後,像C/C++、Fortran、匯編等語言,可以把多個目標文件合並到一個庫文件中,這個就是靜態庫。比如常說的庫函數printf就是libc裡面的函數。
如果有了啟動函數(main),main裡面使用了printf,就可以通過靜態鏈接技術,從libc中提取出printf所在的文件加入到可執行文件中,如果printf還需要其它函數,就繼續搜索並加入列表,直到形成一個閉包。這個就是靜態鏈接。
可是靜態鏈接有個明顯的缺點,如果每個程序都需要printf,那麼printf這個函數的代碼就會同時存在在每個程序中,這樣也太佔地方了吧。所以發明了動態連接技術,其實有兩種形式。無論哪一種,都是首先記錄下需要調用printf這個函數以及所在的動態庫,等到運行的時候再載入動態庫,從動態庫中找到真正的printf去執行。
由於,動態鏈接技術需要一些額外的信息,傳統的靜態庫是不具備的,這些額外信息主要是重復載入和卸載時所需要的一些代碼,因此需要動態鏈接庫。

10. 程序編譯成動態庫能正常運行而靜態庫卻不行!

我感覺問題不太清楚呢,有如下疑問。
1. 樓主是用的BREW4.0或之前的版本來開發的嗎?還是用的最新的Brew MP?
2. 用的模擬器還是下載到設備?
3. 一般不需要自己寫makefile 啊,因為開發brew app有很多固有的框架代碼,這些一般都由IDE上的插件幫忙生成,而且不需要自己構造命令編譯連接的。

我的開發環境是: VC6.0 sp6 + BREW sdk4.0 + ADS1.2 這個可以生成mod下載到手中。
還有另外一個環境:VC2008 + Brew MP 5.0 這個只能在模擬器上測試。

首先,如果不是Brew MP的話,要把程序做成靜態的只能和手機的代碼一起編譯成rom,下載到手機中,這個不能在模擬器上調試。
Brew MP封裝了OEM也就是我們無法直接修改手機代碼,所以它提供了上層編寫靜態程序的方法。
所以有些不太清楚你遇到的是那種情況。

一般來說MALLOC掛掉是分配的太大,這種情況很少,除非我故意去測試,真正開發的時候從來沒有遇到過,而且跟手機代碼一起開發的時候是可以用標准函數malloc的。也可以使用全局變數或靜態變數,動態的不可以。

說到makefile,編譯mod文件一用自己寫,尤其是用VC的時候,brew的插件幫我們寫好了,只要點一下就能進行ARM編譯和鏈接,即使是用ADS來編譯,也不需要自己寫。

有問題再聯系吧

熱點內容
天貓上傳 發布:2025-01-13 06:06:35 瀏覽:156
php處理並發 發布:2025-01-13 06:03:44 瀏覽:282
安卓傳文件的軟體哪個最好 發布:2025-01-13 06:03:07 瀏覽:885
電腦伺服器可以做嗎 發布:2025-01-13 05:59:49 瀏覽:846
前端配置代理的時候怎麼看埠 發布:2025-01-13 05:57:25 瀏覽:910
同桌的你文學腳本 發布:2025-01-13 05:42:12 瀏覽:746
32位加密演算法 發布:2025-01-13 05:39:48 瀏覽:310
腳本寫入軟體 發布:2025-01-13 05:36:49 瀏覽:63
快手自動演算法 發布:2025-01-13 05:28:41 瀏覽:120
python的interpreter 發布:2025-01-13 05:27:56 瀏覽:150