[英]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.