1. 程式人生 > >VS2017 DLL動態庫使用教程【七】為什麼我的程式不能在別人電腦執行

VS2017 DLL動態庫使用教程【七】為什麼我的程式不能在別人電腦執行

考慮一個很最最最簡單的程式:

#include <stdio.h>
#include <Windows.h>
int main()
{
	printf("你好\n");
	system("pause");
	return 0;
}

將其編譯,得到一個*.exe檔案。

在本地自然可以順便執行,有時候你剛剛做完一個這樣的練習,迫不及待地要向朋友炫耀一下。一臉淫笑的你守在QQ旁正期待著讚揚的詞彙,一邊又腦補一下朋友的崇拜,可時間似乎凝固了,彷彿過了一個世紀後——“你發的這東西我怎麼打不開啊?”

這是一個嚴重的問題!

你開始是質疑,是困惑,你覺得他腦子有問題連exe程式都打不開,又或覺得是win太複雜了,他不太適合給這些巨嬰用,也許我應該做一個從新開發一個作業系統,然後吊打微軟收購谷歌....正當你思考這些的時候,一張截圖突然丟過來:

你震驚了,你搞不懂他為什麼會發生這種情況,他已經超出了的知識範疇,至少你翻遍課本也找不出個解決方案。

你頓時倍感失落,發現竟然自己竟如此無力,剛剛還在思考等到駐進矽谷後給我五姑姑二弟的小侄子安排個什麼工作好,頓時夢想破滅了,就如被戳破的肥皂泡,一切都成了過眼煙雲....

好了,做夢結束,我沒有什麼朋友,上邊的錯報是我用win7虛擬機器執行的結果。

為什麼會這樣呢?

原因是vs預設為動態編譯。

在之前的教程裡我們學了靜態編譯與動態編譯的區別,我再把他搬過來:

靜態編譯在程序編譯時dll會被連線到目的碼中,程式執行時將不再需要該靜態庫

動態編譯在程式編譯時dll並不會被連線到目的碼中,而是在程式執行是才被載入

,因此在程式執行時還需要動態庫存在。

因為我的虛擬機器沒有安裝vs,電腦找不到程式使用的這個庫(這個庫是vs自帶的),所以就沒辦法執行。

我們只需設定為靜態編譯即可,讓dll寫進exe內,沒有外部庫也可以執行。

然後重新編譯即可。

對於vs來說:

靜態編譯/MT,/MTD 是指使用libc和msvc相關的靜態庫(lib)。

動態編譯,/MD,/MDd是指用相應的DLL版本編譯。

其中字母含義  d:debug    m:multi-threading(多執行緒)    t:text程式碼    d:dynamic(動態)

值得注意的是,使用靜態編譯回讓程式變大