![](/img/trans.png)
[英]dll linking static library - unresolved linker symbols from unused functions
[英]linking static library into dll
在Windows編程中,如果您有一個靜態庫打算與該dll庫(其中dll定義了/ SUBSYSTEM:WINDOWS鏈接)鏈接,那么應在靜態庫中定義以下哪些marcos?
_LIB
_WINDOWS
我把這些宏弄糊塗了,因為它自己的靜態庫永遠不會顯示它自己的窗口或控制台,所以我不能低估為什么我們需要為靜態庫項目定義這些宏?
在與Google進行了數小時的辯論以及各種論壇和白皮書之后,我發現使用Visual Studio意味着什么!
靜態庫:不需要/ ENTRY或/ SUBSYSTEM,因為該代碼將鏈接到另一個代碼。 因此該庫不需要控制台,windnow或入口點
dll: / SUBSYSTEM應該設置為WINDOWS,/ ENTRY應該不設置,為什么? 沒有條目,因為在Visual Studio中,鏈接器會自動創建DllMain入口點。 dll的子系統應設置為WINDOWS link1 link2另一個示例為什么WINDOWS
exe: / SUBSYSTEM和/ ENTRY應該顯式設置,如果未設置,則鏈接器將再次自動設置子系統AND入口點,如上面的鏈接中所述。
因此,要回答我的原始問題,則無需定義上述“愚蠢”宏:)
請注意以下幾點:
靜態庫中的函數完全有可能創建和操作UI,無論是User32窗口還是控制台(我想都是現代UI)。
除非為此目的提供特殊功能,否則使用您的庫的應用程序將無法確定庫編譯使用了哪些宏。
如果您尚未定義任何宏集(例如WINVER
),則Windows標頭有時會提供默認值
這些宏就像您的代碼使它們一樣神奇。 如果您不測試它們,那么定義它們幾乎沒有效果。
如果您的庫確實有條件地使UI功能可用,則在編譯時使用#if defined(_WINDOWS)
跳過這些功能比運行時啟用標志具有一些優勢。
特別是,如果預處理器剝離了對UI函數的調用,則鏈接程序將不需要將UI DLL添加到導入表中。 您的庫是否適用於Windows的Server Core安裝可能會有所不同。 同時,運行時檢查很不錯,因為您只需要編譯一次庫並分發一個版本。 使用運行時啟用標志並將鏈接器設置為使用延遲負載可能會同時兼顧兩個方面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.