當前位置:首頁 » 編程軟體 » 靜態鏈接編譯後怎麼執行

靜態鏈接編譯後怎麼執行

發布時間: 2022-12-06 21:13:03

A. 何謂靜態鏈接何謂裝入時動態鏈接和運行時的動態鏈接

靜態鏈接是由鏈接器在鏈接時將庫的內容加入到可執行程序中的做法。鏈接器是一個獨立程序,將一個或多個庫或目標文件(先前由編譯器或匯編器生成)鏈接到一塊生成可執行程序。

靜態鏈接的最大缺點是生成的可執行文件太大,需要更多的系統資源,在裝入內存時也會消耗更多的時間。
像Unix ld程序這樣的靜態鏈接器(static linker)以一組可重定位的目標文件作為輸入,生成一個完全連接的可以載入和運行的可執行目標文件作為輸出。輸入的可重定位目標文件由各種不同的代碼和數據節(section)組成。指令在一個節中,初始化的全局變數在一個節中;而未初始化的變數在另外一個節中。

動態鏈接英文是Dynamic Linking,他是使得不同的程序開發者和部門能夠相對獨立地開發和測試自己的程序模塊,從某種意義上來講大大促進了程序的開發效率,原先限製程序的規模也隨之擴大。但是慢慢地靜態鏈接的諸多缺點也逐步暴露出來,比如浪費內存和磁碟空間、模塊更新困難等問題,使得人們不得不尋找一種更好的方式來組織程序的模塊。

動態鏈接與靜態鏈接對比

靜態鏈接
優點:
① 代碼裝載速度快,執行速度略比動態鏈接庫快;
② 只需保證在開發者的計算機中有正確的.LIB文件,在以二進制形式發布程序時不需考慮在用戶的計算機上.LIB文件是否存在及版本問題,可避免DLL地獄等問題。
缺點:
使用靜態鏈接生成的可執行文件體積較大,包含相同的公共代碼,造成浪費;

動態鏈接
優點:
①更加節省內存並減少頁面交換;
② DLL文件與EXE文件獨立,只要輸出介面不變(即名稱、參數、返回值類型和調用約定不變),更換DLL文件不會對EXE文件造成任何影響,因而極大地提高了可維護性和可擴展性;
③不同編程語言編寫的程序只要按照函數調用約定就可以調用同一個DLL函數;
④適用於大規模的軟體開發,使開發過程獨立、耦合度小,便於不同開發者和開發組織之間進行開發和測試。
缺點:
使用動態鏈接庫的應用程序不是自完備的,它依賴的DLL模塊也要存在,如果使用載入時動態鏈接,程序啟動時發現DLL不存在,系統將終止程序並給出錯誤信息。而使用運行時動態鏈接,系統不會終止,但由於DLL中的導出函數不可用,程序會載入失敗;速度比靜態鏈接慢。當某個模塊更新後,如果新模塊與舊的模塊不兼容,那麼那些需要該模塊才能運行的軟體,統統撕掉。這在早期Windows中很常見。[1]
頁面
動態頁面:含有?的,或是以asp,php,jsp,aspx結尾的都是動態,動態頁面是可以通過網站後台管理系統對網站的內容進行更新管理,動態頁面在伺服器裡面不是真實存在的,訪問動態頁面需要經過資料庫,動態頁面是動態連接,發布公司產品,交流互動,博客,網上調查等,這都是動態網站的一些功能。

B. 如何靜態鏈接pthreads-win32

pthreads-win32是windows下的pthread庫,它默認採用的是動態鏈接庫的鏈接方式,因此在使用該庫的程序都需要帶上一個動態庫pthreadVC2.dll,感覺挺不方便的,下面介紹如何靜態鏈接pthreads-win32:
首先要編譯靜態庫:
ftp
//sources
redhat
com/pub/pthreads-win32/下載最新的庫安裝包,筆者下載的是pthreads-w32-2-8-0-release.exe,自解壓到一個目錄,用vc7打開pthreads.2目錄下的pthread.dsw,會提示工程版本轉換,選擇全是,然後打開該工程的屬性頁,在「常規」選項頁的配置類型選擇「靜態庫(.lib)」,在「c/c++」選項頁的預處理器定義刪除_USRDLL和PTW32_BUILD,添加PTW32_STATIC_LIB,確定保存即可。當然,你需要根據你的需要選擇運行時庫的類型。最後重新生成pthread便可生成我們需要的pthread.lib。
下面講述如何使用前面生成的靜態庫:新建一個控制台工程,將pthread.lib拷貝到工程目錄,在預處理器定義中添加PTW32_STATIC_LIB,附加包含目錄添加pthreads-win32代碼所在目錄,筆者是E:/pthreads/pthreads.2,附加依賴項添加Ws2_32.lib和pthread.lib即可,簡單使用代碼如下:
#include
<iostream>
#include
"pthread.h"
void
*
Function_t(void
*
Param)
{
std::cout
<<
"我是線程!"
<<
std::endl;
pthread_t
myid
=
pthread_self();
printf(
"線程ID
=
%d",
myid
);
return
NULL;
}
int
main()
{
#ifdef
PTW32_STATIC_LIB
pthread_win32_process_attach_np();
#endif
pthread_t
pid;
pthread_attr_t
attr;
pthread_attr_init(&attr);
pthread_attr_setscope(&attr,
PTHREAD_SCOPE_PROCESS);
pthread_attr_setdetachstate(&attr,
PTHREAD_CREATE_DETACHED);
pthread_create(&pid,
&attr,
Function_t,
NULL);
std::cout
<<
"========================================"
<<
std::endl;
getchar();
pthread_attr_destroy(&attr);
#ifdef
PTW32_STATIC_LIB
pthread_win32_process_detach_np();
#endif
return
1;
}
其中
#ifdef
PTW32_STATIC_LIB
pthread_win32_process_attach_np();
#endif
#ifdef
PTW32_STATIC_LIB
pthread_win32_process_detach_np();
#endif
對於靜態鏈接方式非常重要,如果沒有這段代碼,線程將創建失敗。

C. C語言既可以編譯執行又可以解釋執行嗎 編譯執行怎麼解釋 解釋執行又怎麼解釋

C 語言程序僅可以解釋執行。

解釋程序是將源程序(如BASIC)作為輸入,解釋一句後就提交計算機執行一句,並不形成目標程序。編譯程序是把高級語言(如FORTRAN、COBOL、Pascal、C等)源程序作為輸入,進行翻譯轉換,產生出機器語言的目標程序,然後再讓計算機執行這個目標程序,得到計算結果。

相對於編譯性語言,其優點是可移植性好,只要有解釋器環境,程序就可以在不同的操作系統上運行。

缺點是代碼需要有專門的解釋器,在程序運行時,除要給用戶程序本身分配內存空間外,解釋器也佔用系統資源,所以其運行速度較慢。另外,也很難達到像C、C++那樣操作系統底層操作的目的。

解釋型語言常用於,一是對運行速度要求不高(如一些網頁腳本等)的場合,二是對跨平台(操作系統的兼容性)有要求的場合。

(3)靜態鏈接編譯後怎麼執行擴展閱讀

1、Python和Java語言,專門有一個解釋器能夠直接執行Python程序,每個語句都是執行的時候才翻譯。

2、Python代碼在運行前,會先編譯成中間代碼,每個 .py 文件將被換轉成pyc 文件,pyc 就是一種位元組碼文件,它是與平台無關的中間代碼。不管放在 Windows 還是 Linux 平台都可以執行,運行時將由虛擬機逐行把位元組碼翻譯成目標代碼。

D. ImageMagick的靜態編譯,靜態鏈接有關問題怎麼解決

首先,使用最新版的imagemagick,因為較早的版本不能很好的支持static編譯方式(據說小於6.5的都可能有問題)。
第二,到imagemagick-src目錄,執行命令 ./configure --disable-shared --prefix=$(YOUR_IM_PATH)
第三,如果你有動態庫需要使用這個靜態編譯的imagemagick,那麼還要export CFLAGS="-O3 -Wall -fPIC"
第四,執行make命令,執行make install命令

第五,去$(YOUR_IM_PATH)目錄,欣賞一下bin/Magick++-config --cppflags --cxxflags --ldflags --libs的輸出
第六,回到你自己的項目目錄,寫代碼調用imagemagick

第七,編譯g++ -o mytest -g -O3 main.cpp `$(YOUR_IM_PATH)/Magick++-config --cppflags --cxxflags --ldflags --libs`

最後,ldd mytest看看依賴項是否符合預期。

另外,configure的時候,建議加上參數--with-quantum-depth=8 --disable-openmp

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

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

F. 如何編譯C/Fortran動態/靜態鏈接庫

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

G. 編譯原理 什麼是靜態鏈

1、路由器的工作原理
路由工作簡單原理圖
在這里插入圖片描述
1)主機1.1要發生數據包給主機4.1.因為IP地址不在同一網段,所以主機會將數據包發送給本網段的網關路由器。
2)路由器A 接收到數據包,先查看數據包IP首部中的目標IP地址。再查找自己的路由表。數據包的目標IP地址是4.1.屬於4.0網段,路由器A 在路由表中查到4.0網段轉發的介面是S0介面,於是路由器A將數據從S0介面轉發出去。
3)網路中的每個路由器都是按照這樣的步驟轉發數據的,直到到達路由器B,再用同樣的方法從E0介面轉發出去,最後主機4.1接收到這個數據包。
2、路由表
(1)概念
路由器中維護的路由條目的集合。
路由器根據路由表做的路徑選擇。
(2)路由表的形成
1)直連網段
配置IP地址,埠UP 狀態,形成直連路由。
2)非直連網段
需要靜態路由或動態路由,將網段添加到路由表中。
3、靜態路由
由管理員手工配置的,是單向的。缺乏靈活性。
管理員可以通過靜態路由來控制數據包在網路中的流動。
4、默認路由
一種特殊的靜態路由,當路由器在路由表中找不到目標網路的路由條目時,路由器把請求轉發到默認路由介面。
當默認路由存在末梢網路時,默認路由會大大簡化路由器的配置。
5、路由器轉發數據包的分裝過程
HostA向HostB發送數據
在這里插入圖片描述
1)HostA在網路層將上層的報文封裝成IP數據包,其首部包含源地址和目的地址。源地址即本機IP地址192.168.1.2,目的地在為HostB的IP地址192.168.2.2,HostA使用本機配置的24位掩碼於目的地址進行「與」運算,得出目的地在與本機地址不在同一網段,因此發往HostB的數據包需要經過網關路由器A轉發。
2)HostA通過ARP請求獲得默認網關路由器A 的E0介面MAC 地址00-11-12-21-22-22.在數據鏈路層HostA將IP數據包封裝成乙太網數據幀,在乙太網首部的源MAC地址為00-11-12-21-11-11,目的MAC地址為網關E0介面的MAC地址00-11-12-21-22-22
3)路由器A從E0介面接收到數據幀,把數據鏈路層的封裝去掉。路由器A認為這個IP數據包是要通過自己進行路由轉發,所以路由器A會自己查找自己的路由表,尋找與目標IP地址192.168.2.2相匹配的路由表項,然後根據路由表的下一跳地址將數據包轉發到E1介面。
4)在E1介面路由器A 重新封裝乙太網幀,此時源MAC地址為路由器A的E1介面MAC地址00-11-12-21-33-33,目的MAC地址為與之相連的路由器B的E1介面MAC地址00-11-12-21-44-44
5)路由器B從E1介面接收到數據幀,同樣會吧數據鏈路層的封裝去掉。對目的IP地址進行檢查,並與路由表進行匹配,然後根據路由表的下一跳信息將數據包轉發到E0介面。路由器B發現目的網段與自己的E0介面相連,通過ARP廣播,路由器B獲得HostB以太口的MAC地址00-11-12-21-66-66.路由器B在將IP數據包封裝成乙太網幀,源MAC地址為路由器B的E0介面的MAC地址00-11-12-21-55-55,目的MAC地址為HostB的MAC地址00-11-12-21-66-66.封裝完畢,將乙太網幀從E0介面發往HostB.

H. mfc 做的一個程小軟體,但是exe文件獨立出來(用了靜態鏈接)vC編譯工程後才能執行,不然沒反應

不能執行提示什麼。一般靜態鏈接編譯後是可以運行的了

I. 如何編譯靜態鏈接的程序,通過./configure 把參數-static傳入Makefile。

./configure LDFLAGS=-static

J. 編寫好一個程序後怎樣測試謝謝

一般分為系統程序和應用程序兩大類。

編輯本段常見的編程語言
* .NET * pacel * ActionScript * APL、A+和J * Ada

具體要知道你是哪方面的程序和應用了哪些編程語言,一般網路能搜索到

熱點內容
用linux做什麼 發布:2023-02-09 03:42:37 瀏覽:770
故事分鏡頭腳本 發布:2023-02-09 03:42:22 瀏覽:180
雲存儲馬雲 發布:2023-02-09 03:41:39 瀏覽:216
滾動截屏android 發布:2023-02-09 03:40:04 瀏覽:981
d盤存儲為0 發布:2023-02-09 03:34:52 瀏覽:249
我的世界181伺服器ip 發布:2023-02-09 03:33:47 瀏覽:266
電腦連接伺服器後卡頓 發布:2023-02-09 03:30:30 瀏覽:921
如何防止硬碟等移動存儲設備安全 發布:2023-02-09 03:28:50 瀏覽:219
c語言整人程序 發布:2023-02-09 03:27:56 瀏覽:996
盛嘉華苑公租房屋裡有什麼配置 發布:2023-02-09 03:27:10 瀏覽:575