2013-12-15 30 views
1

我很困惑,爲什麼__declspec(dllexport)或同等需要在頭文件中去。說我正在寫一個圖書館。當然,用戶不需要知道或擔心符號是否被導出,他們關心的只是函數聲明存在,並且可能會與共享庫或靜態庫本身鏈接。那麼爲什麼不能將所有這些樣板文件放入源文件中,僅在構建時使用?dllexport在標題混淆

我想到的唯一用例是某人正在編寫我的庫的包裝並需要導出所有函數的情況,但通常情況並非如此 - 是否真的值得將所有導出的東西放在公共頭文件中?有什麼我錯過了,這是鏈接器的技術限制..?

我這麼問是因爲我喜歡我的頭和構建系統是乾淨的,並作爲dllexport東西一般設定/不設定基於我們是否建庫爲共享或靜態庫,我發現它奇怪的是,它應該最終進入公共頭部,因爲它(根據我的理解)基本上是一個構建時間的概念。那麼有人可以請我啓發我失蹤?

回答

1

我不確定我能否提供一個很好的答案。我的印象是,它具有多種用途:

  1. 它加速的DLL,使用大量的DLL的尤其是當的加載(因爲有更少的輸出符號進行搜索)
  2. 它減少符號碰撞的可能性在運行時(這是因爲減少出口符號)
  3. 它允許鏈接器抱怨未定義的符號(而不是僅僅假設它可能會在運行時找到它們。

我敢肯定還有其他的原因。我通常將我的API包裝在一些東西中像這樣:

#if defined(MY_LIB_CREATION) 
    #define MY_LIB_API __declspec(dllexport) 
#else 
    #define MY_LIB_API __declspec(dllimport) 
#endif 

然後我所有的API函數&類被定義爲MY_LIB_API:

class MY_LIB_API Foo {}; 
MY_LIB_API void bar(); 

然後在項目文件中定義爲實現您的圖書館項目MY_LIB_CREATION。