簡體   English   中英

構建一個DLL時,lib可以用於鏈接嗎?

[英]When building a dll, can the lib be used for linking?

我想創建一個C ++ DLL(用於點網應用程序)。 我需要的一些功能已經在另一個C ++ DLL中實現了。

我引用的dll是這樣設置的(包括評論):

extern "C"
{
  __declspec(dllexport) BOOL SomeFunctionToBeUsedExternally();
}
// internal functions
BOOL OtherFunctions();

我需要在我的代碼中使用其中一個OtherFunctions

所以,我在我自己的代碼中添加了正確的include,在上面的dll創建的lib上添加了依賴項,並使用了我需要的方法。 結果,當然,我得到了另一個__declspec(dllexport)...函數。

但它拒絕鏈接,我收到了關於OtherFunction的錯誤。

我驗證了所有內容,在線查看 - 似乎沒有解決我的問題。

然后,我在我需要的函數前面添加了一個__declspec(dllexport) ,它可以工作。

我不明白。 我想,dllexport標記的函數會被導出到dll,但是不是所有函數都發送到了lib嗎?

為什么我必須將函數導出到dll,如果我沒有鏈接到DLL而不是lib?

不,只有導出的函數最終會出現在.lib中。 你可以說。

不是靜態鏈接庫,而是DLL的導入庫。 它是一個非常簡單和非常小的文件,因為它根本不包含任何代碼。 只是導出函數的列表。 鏈接器需要它來解析客戶端代碼中的外部,它需要知道DLL的名稱和實際導出的函數名稱或序號(可能是不同的),因此它可以將條目添加到客戶端的導入表中。 導入與靜態庫具有相同文件擴展名的庫可能有點不幸。

不,鏈接器不會自動導出所有標識符。 dllexport屬性告訴鏈接器導出哪些標識符。 如果沒有這個,您將被迫導出DLL中的每個標識符或指定不應導出哪些標識符。 當鏈接器創建DLL時,它還會創建一個導入庫,並包含有關基於該屬性導出哪些標識符的信息。

當您想要使用DLL時,您需要與相應的.lib文件鏈接,這是有充分理由的。 .lib文件告訴鏈接器導出哪些標識符,它們所在的DLL的名稱以及其他信息。 也可以通過序號而不是名稱從DLL導出標識符。 在這種情況下,鏈接器仍然需要將標識符與適當的序號匹配。 只有擁有包含該信息的附帶庫文件才能實現這一點,因為它不存在於DLL的導出表中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM