導航:首頁 > 源碼編譯 > 靜態編譯為什麼是dll

靜態編譯為什麼是dll

發布時間:2022-08-01 16:52:38

A. 易語言怎麼靜態編譯出dll文件

遠程我給你操作,
具體方式
點開易語言
然後
新建windows動態鏈接庫
然後寫代碼
編譯後就是DLL.文件
謝謝參考!

B. SOUI的utilities模塊為什麼要用DLL編譯

SOUI相對於DuiEngine一個重要的變化就是很多模塊變成了一個單獨的DLL。
然後很多情況下用戶可能希望整個產品就是一個EXE,原來DuiEngine提供了LIB編譯模式,此時鏈接LIB模式的DuiEngine就行了。
但是SOUI默認至少Utilities那個模塊是不提供LIB編譯模式的。
utilities之所以默認只提供DLL編譯是因為SString類是由utilities實現的。
字元串是編譯中碰到的最最見的基本對象之一。在運行庫(CRT)動態編譯(MD,MDd)時這不是問題,因為所有模塊的內存分配都是在一個相同的運行庫(CRT)上,這時在不同模塊之間傳遞對象相對簡單。如果項目採用運行庫靜態編譯(MT or MTd),在不同模塊之間傳遞字元串對象是非常困難的,因為一不小心就會發生在A模塊中分配的字元串對象被B模塊釋放。
utilities採用DLL編譯就是為了解決這個字元串對象的跨模塊傳遞。
採用運行庫動態編譯的情況就不說了,這里主要介紹採用靜態庫編譯的CRT的情況。
SOUI中使用的字元串對象採用了一點技巧:每一個String對象中只有一個指針成員變數:
template <class tchar, class tchar_traits>
class TStringT
{
public:
typedef tchar _tchar;
typedef const _tchar * pctstr;

protected:
tchar* m_pszData; // pointer to ref counted string data
};
雖然TStringT是一個模板類,在SOUI中採用類導出的方式將該模板的兩個特化類導出:

#ifdef UTILITIES_EXPORTS
# define EXPIMP_TEMPLATE
#else
# define EXPIMP_TEMPLATE extern
#endif

#pragma warning (disable : 4231)

EXPIMP_TEMPLATE template class UTILITIES_API TStringT<char, char_traits>;
EXPIMP_TEMPLATE template class UTILITIES_API TStringT<wchar_t, wchar_traits>;
復制代碼
通過將string類導出,保證string的所有運行代碼都是在utilities這個模塊內部,這也就保證了string對象的唯一成員變數:

tchar* m_pszData;

的內存分配及釋放固定在utilities這個模塊里。

通過這樣處理,無論用戶定義string是在哪一個模塊,真正的內存管理還是在utilities里,從而使得string對象可以方便的在不同模塊之間傳遞。

比較一下std::string就可以發現,如果使用std::string在不同模塊之間傳遞對象將是非常危險的,因為std::string是模板類,它的代碼將會被編譯到不同的模塊中,也就是說在不同的模塊中調用std::string的成員函數執行的代碼是不一樣的,這樣在A模塊中聲明的string傳遞到B模塊再被B模塊釋放程序就崩潰了。

C. vs2010為什麼設置了靜態編譯還是需要dll文件才能運行exe

靜態編譯:就是在編譯可執行文件的時候,將可執行文件需要調用的對應動態鏈接庫(.so)中的部分提取出來,鏈接到可執行文件中去,使可執行文件在運行的時候不依賴動態鏈接庫。

編譯方式:

第1種:

設置:

1、項目->配置屬性->常規->MFC的使用:在靜態庫中使用MFC

2、項目 -> 配置屬性->C/C++->代碼生成->運行庫 :選擇 多線程調試(/MTd)。

編譯時,選擇的是debug,win32

然後執行編譯生成方案,在該工程目錄下的debug文件中,找到該.exe文件,即可在其他電腦運行。

第2種:

一般可以配置一下兩項:

1.項目 -> 配置屬性->常規->MFC的使用 :在靜態庫中使用MFC。

2.項目 -> 配置屬性->C/C++->代碼生成->運行庫 :選擇 多線程調試(/MT)。

編譯時,選擇的是release,win32(這個選擇項在工具欄的debug選框中,一般我們使用debug方式)

D. 易語言 靜態編譯出來的.exe 為什麼還要和皮膚dll放一塊才能運行.

任何編譯器都不可能把調用的Dll編譯到程序里,否則將會加大程序體積且Dll也會失去它的發明目的。有的Dll文件不需要打包,比如windos目錄下的User32.dll確保每個系統都有的就不用打包,你使用的Dll文件應自行打包到運行目錄下

E. 易語言靜態編譯為什麼是exe

DLL是動態鏈接庫、EXE是可執行文件;另外,E還可以編譯模塊.ec之類的,這就要看你需要了。目前E靜態後都是EXE,不能DLL或者其他格式,除非E官方放出靜態可以其他格式,再說DLL編譯後就是單獨的DLL了 其他編程軟體也能調用

F. windows中LIB和DLL的區別與使用

關於lib和dll的區別如下:
(1)lib是編譯時用到的,dll是運行時用到的。如果要完成源代碼的編譯,只需要lib;如果要使動態鏈接的程序運行起來,只需要dll。
(2)如果有dll文件,那麼lib一般是一些索引信息,記錄了dll中函數的入口和位置,dll中是函數的具體內容;如果只有lib文件,那麼這個lib文件是靜態編譯出來的,索引和實現都在其中。使用靜態編譯的lib文件,在運行程序時不需要再掛動態庫,缺點是導致應用程序比較大,而且失去了動態庫的靈活性,發布新版本時要發布新的應用程序才行。
(3)動態鏈接的情況下,有兩個文件:一個是LIB文件,一個是DLL文件。LIB包含被DLL導出的函數名稱和位置,DLL包含實際的函數和數據,應用程序使用LIB文件鏈接到DLL文件。在應用程序的可執行文件中,存放的不是被調用的函數代碼,而是DLL中相應函數代碼的地址,從而節省了內存資源。DLL和LIB文件必須隨應用程序一起發行,否則應用程序會產生錯誤。如果不想用lib文件或者沒有lib文件,可以用WIN32 API函數LoadLibrary、GetProcAddress裝載。

G. 易語言靜態編譯出dll文件後該怎麼打開

DLL是動態鏈接庫。。是不能打開的。注入器倒是沒有。以前的現在應該也不能用了
一般要用到
——————————我倒是有幾個以前的注入器源碼。..
輸入法.安裝 ()
輸入法.設置注入

H. 為什麼我下載的易語言源碼編譯出來後是DLL文件

載的易語言源碼,源碼都是.e的後綴
但是你的這個源碼,人家做的時候就是弄的.DLL動態鏈接庫,所以編譯後就是DLL。
這個應該是G吧??需要注入的

I. 為什麼易語言靜態編譯後還是提示找不到dll

系統提示丟失dll文件解決辦法:
1、下載缺少的dll文件,復制到c:\windows\system32文件夾下;
2、按win+r,輸入regsvr32 /s 該文件文件名XX.DLL,點擊確定;
3、彈出提示信息框,提示注冊成功,點擊確定即可。
4、用騰訊電腦管家電腦診所--搜 缺失dll文件--立即修理

閱讀全文

與靜態編譯為什麼是dll相關的資料

熱點內容
php自動列印 瀏覽:469
哪個app多年輕人 瀏覽:902
租的伺服器如何重裝 瀏覽:937
乾眼症程序員 瀏覽:239
樂動達人安卓版有什麼游戲 瀏覽:484
c523壓縮比 瀏覽:543
命令語氣的人什麼心態 瀏覽:435
程序員喜歡留指甲嗎 瀏覽:516
七牛雲伺服器收費標准 瀏覽:627
時光相冊加密空間密碼忘記 瀏覽:474
華為雲為用戶提供的服務雲伺服器 瀏覽:634
minecraftlinux伺服器搭建 瀏覽:376
linux命令新建文件 瀏覽:709
長線pdf 瀏覽:607
程序員電腦支持手寫 瀏覽:414
解壓頭戴式耳機推薦 瀏覽:344
紙條app上怎麼樣看對方主頁 瀏覽:883
編譯英語單詞怎麼寫 瀏覽:249
編譯原理和匯編原理的區別 瀏覽:864
如何給加密的pdf解密 瀏覽:770