2011-01-13 103 views
2

我有一個靜態鏈接dll文件到項目中的問題。我正在使用Builder C++ 6.靜態包括dll文件

I've unchecked: 
Project \ Options \ Packages -> Build with runtime packages 
Project \ Options \ Linker -> Use dynamic RTL 
Project \ Options \ CodeGuard -> CodeGuard Validation 

I've also added dll files using Project Manager: 
myProject \ Add -> myFile.dll 

當然,我已經重建了所有更改後的項目,它仍然要求在運行時的一些dll文件。我省略了什麼?

+0

DLL代表* Dynamic-link * Library。 – Philipp 2011-01-13 17:41:00

回答

2

當您靜態鏈接到DLL時,實際發生的情況是編譯器檢測到您的代碼正在調用哪個DLL函數,並設置存根指針,然後鏈接器將其插入到應用程序的IMPORTS表中。在運行時,當您的應用程序運行時,OS加載器將首先通過將引用的DLL加載到內存中並根據需要更新函數指針來修補IMPORTS表(等等)。這發生在應用程序內部的任何代碼開始運行之前。如果加載程序無法解析引用,它將顯示錯誤並終止進程。 DLL本身沒有被編譯到應用程序本身中。它必須保留爲外部文件(如果需要,它可以與多個應用程序/進程共享),並安裝在OS加載程序可以找到它的位置。這是如何設計使用DLL的。改變項目選項的數量不會改變這一點。

如果您希望將庫代碼直接編譯到應用程序中,則需要創建靜態庫而不是DLL。

6

不能鏈接到這樣的DLL。您需要先創建一個.LIB,然後鏈接到該鏈接。

如果您無法創建.LIB,則可以使用.DEF。請閱讀this或Google。

(順便說一句:生成C++具有相同或類似名稱的工具在MSDN上)

0

而不是增加自己的dll,看here如何創建自己的靜態庫,它可以添加到您的項目。如果你只是擁有dll,不可能創建一個靜態庫。你只能從一個DLL生成一個導入庫,並且你也需要分發這個DLL。

+0

嗯..我寫在我的帖子中,我沒有選中這些選項,所以據我瞭解,它可以靜態鏈接。我對嗎?但是,你的答案的第二部分清楚地表明,即使通過一個庫,我仍然必須包含dll,因爲我只有dll。在這種情況下保持動態更簡單。 – qlf00n 2011-01-13 14:41:16