導航:首頁 > 源碼編譯 > 只有動態鏈接庫能編譯嗎

只有動態鏈接庫能編譯嗎

發布時間:2023-06-19 09:25:59

『壹』 介紹靜態鏈接庫和動態鏈接庫的區別,及在VC+

靜態連接庫就是把(lib)文件中用到的函數代碼直接鏈接進目標程序,程序運行的時候不再需要其它的庫文件;動態鏈接就是把調用的函數所在文件模塊(DLL)和調用函數在文件中的位置等信息鏈接進目標程序,程序運行的時候再從DLL中尋找相應函數代碼,因此需要相應DLL文件的支持。

靜態鏈接庫與動態鏈接庫都是共享代碼的方式,如果採用靜態鏈接庫,則無論你願不願意,lib 中的指令都全部被直接包含在最終生成的 EXE 文件中了。但是若使用 DLL,該 DLL 不必被包含在最終 EXE 文件中,EXE 文件執行時可以「動態」地引用和卸載這個與 EXE 獨立的 DLL 文件。靜態鏈接庫和動態鏈接庫的另外一個區別在於靜態鏈接庫中不能再包含其他的動態鏈接庫或者靜態庫,而在動態鏈接庫中還可以再包含其他的動態或靜態鏈接庫。動態庫就是在需要調用其中的函數時,根據函數映射表找到該函數然後調入堆棧執行。如果在當前工程中有多處對dll文件中同一個函數的調用,那麼執行時,這個函數只會留下一份拷貝。但是如果有多處對lib文件中同一個函數的調用,那麼執行時,該函數將在當前程序的執行空間里留下多份拷貝,而且是一處調用就產生一份拷貝。

靜態鏈接庫與靜態鏈接庫調用規則總體比較如下:

1、靜態鏈接庫(比較簡單):

首先,靜態鏈接庫的使用需要庫的開發者提供生成庫的.h頭文件和.lib文件。生成庫的.h頭文件中的聲明格式如下:

extern "C"函數返回類型函數名(參數表);

在調用程序的.cpp源代碼文件中如下:

#include "../lib.h"

#pragma comment(lib,"..//debug//libTest.lib")//指定與靜態庫一起鏈接

其次因為靜態鏈接庫是將全部指令都包含入調用程序生成的EXE文件中。因此如果用的是靜態鏈接庫,那麼也就不存在「導出某個函數提供給用戶使用」的情況,要想用就得全要!要不就都別要!

靜態鏈接庫(Lib)

在VC++6.0中new一個名稱為libTest的static library工程,並新建lib.h和lib.cpp兩個文件,lib.h和lib.cpp的源代碼如下:

//文件:lib.h

#ifndef LIB_H

#define LIB_H

extern "C" int add(int x,int y);//聲明為C編譯、連接方式的外部函數

#endif


//文件:lib.cpp

#include "lib.h"

int add(int x,int y)

{ return x + y; }

編譯這個工程就得到了一個.lib文件,這個文件就是一個函數庫,它提供了add的功能。將頭文件和.lib文件提交給用戶後,用戶就可以直接使用其中的add函數了。
標准Turbo C2.0中的C庫函數(我們用來的scanf、printf、memcpy、strcpy等)就來自這種靜態庫。
下面來看看怎麼使用這個庫,在libTest工程所在的工作區內new一個libCall工程。libCall工程僅包含一個main.cpp文件,它演示了靜態鏈接庫的調用方法,其源代碼如下:

#include <stdio.h>

#include "../lib.h"//不可丟失

#pragma comment( lib, "..//debug//libTest.lib" ) //指定與靜態庫一起連接

int main(int argc, char* argv[])

{ printf( "2 + 3 = %d", add( 2, 3 ) ); }

靜態鏈接庫的調用就是這么簡單,或許我們每天都在用,可是我們沒有明白這個概念。代碼中#pragma comment( lib , "..//debug//libTest.lib" )的意思是指本文件生成的.obj文件應與libTest.lib一起連接

2、 動態鏈接庫:

動態鏈接庫的使用需要庫的開發者提供生成的.lib文件和.dll文件。或者只提供dll文件。

首先我們必須先注意到DLL內的函數分為兩種:

1)外部函數,可供應用程序調用;

2)DLL內部函數,只能在DLL程序使用,應用程序無法調用它們。

因此調用程序若想調用DLL中的某個函數就要以某種形式或方式指明它到底想調用哪一個函數。

『貳』 如何編譯 opencv動態鏈接庫

在一個項目中需要用到OpenCV,剛開始使用了OpenCV的動態鏈接庫,這樣,在移動可執行程序時還必須將OpenCV動態支持庫一起搬移,很是麻煩。所以,最終選擇OpenCV靜態鏈接庫,這樣程序移植運行就方便了很多。

需要編譯成靜態庫以便於應用程序鏈接。

網上有的教程中寫的在VC++2010下安裝OpenCV2.1時用到了TBB庫,而我在編譯鏈接自己的程序後需要用到TBB.dll。本人設計的目的就是要做一個獨立的界面程序,不需要攜帶其他第三方庫。經過一段時間的努力最終找到了編譯OpenCV2.1靜態庫的方法。

『叄』 c++ 關於動態鏈接庫編譯的問題

出現一個Executable For Debug Session對話框
---------------------------------------------
當你出現這個對話框時,是提示你應該選擇一個.exe文件用來測試。
如果要設置的話:依次在主菜單中,工程-->設置-->debug下就可以看到這個對話框的設置了。

提示沒有可執行文件來測試這個DLL文件。

因為,DLL文件自己是不能執行的,所以需要一個可執行文件(.exe)來載入它來測試。

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

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

『伍』 靜態編譯和動態編譯有何不同

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

『陸』 求教:aix下動態鏈接庫*.so文件如何編譯出來

先檢查你的編譯器是什麼編譯器:
看是gcc還是cc,下面是cc版本的
編譯成32位版本:
cc -q32 -qmkshrobj -o XXXXXX.so XXXXXX.c
編譯成64位版本:
cc -q64 -qmkshrobj -o XXXXXX.so XXXXXX.c

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

舉例文件: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:.

『捌』 求助,依賴的動態庫包含靜態庫,編譯報錯說找

動態鏈接庫和靜態鏈接庫一般是編譯集成一系列的介面(函數)
在程序源代碼編譯完成後通過編譯器編譯並通過鏈接器與這些庫進行鏈接
動態鏈接庫與靜態鏈接庫的區別在於鏈接器在進行鏈接時靜態庫會被直接編譯進程序里
而動態鏈接庫並不會,我們這里將這些鏈接庫稱作依賴(動態庫和靜態庫)
程序的運行需要這些依賴,程序在靜態鏈接後該程序本身便已包含該依賴
而動態鏈接後的程序本身本不包含該依賴,這些依賴需要執行者自行安裝進操作系統(動態庫、運行時庫)
程序運行時會動態地載入這些庫

linux上動態庫一般的後綴後為.so
靜態庫一般的後綴為.a
由於靜態鏈接會直接將庫編譯進程序里所以靜態編譯後的程序相較於動態鏈接所要大
這就是因為靜態鏈接會將鏈接庫編譯進程序里的原因,所以佔用就要大了
出於這種原因,靜態庫不易於維護與更新,如果鏈接庫中有實現有bug等需要更新則需要更新整個程序,因為靜態庫被編譯進程序中了
但動態庫就沒有這種情況了,因為動態庫是程序運行時動態載入的,所以我們只需要更新動態庫而不需要更新所有依賴該庫的程序(軟體)

另一方面,很多程序的開發都會使用到相同的鏈接庫,也就是很多程序(軟體)會有相同的依賴
如果將這些依賴全部靜態編譯的話將會造成存儲資源佔用過多而造成資源浪費
而使用動態庫的方式這些程序(軟體)則可以共享一個鏈接庫,而不需要每個程序都帶一個鏈接庫,這樣就大大地減少了存儲資源佔用空間

『玖』 製作DLL的源文件能不能編譯成.SO文件

純C寫的話,移植到linux應該是很容易的

順利的話直接在linux下編譯就行了,不順利的話,需要把windos下的函數替換成對應的linux下的,或者自己再封裝一層

閱讀全文

與只有動態鏈接庫能編譯嗎相關的資料

熱點內容
女程序員真實圖片 瀏覽:696
pic單片機燒寫 瀏覽:814
linuxping結果 瀏覽:196
單片機採集負電壓 瀏覽:407
伺服器收件什麼意思 瀏覽:893
單片機發數組 瀏覽:884
魔方虛擬主機銷售系統源碼 瀏覽:709
rsa驗簽php源碼 瀏覽:514
github怎麼直接打開源碼 瀏覽:529
和家親app怎麼下載不了了 瀏覽:728
藍屏程序員 瀏覽:78
androidinflatexml 瀏覽:489
魔獸爭霸2下載好了怎麼解壓 瀏覽:920
怎麼做少女心解壓本 瀏覽:203
php刷新cookie 瀏覽:737
推薦伺服器怎麼關閉 瀏覽:615
dos命令隱藏窗口 瀏覽:591
三國志13用什麼解壓 瀏覽:979
單片機水霧化的方法 瀏覽:248
解出來為2的加密方式 瀏覽:477