我有一個全局的函數指針列表。這個列表應該在啓動時填充。順序並不重要,並且不存在會使靜態初始化複雜化的依賴關係。爲了實現這一點,我寫了一個類,在其構造函數中爲此列表添加單個條目,並在必要時通過宏分散此類的全局實例。這種方法的主要目標之一是不需要從外部顯式引用該類的每個實例,而是允許每個需要在列表中註冊某些內容的文件獨立執行。很好,很乾淨。如何在靜態鏈接庫中強制構建全局對象? [MSVC9]
但是,將這些對象放置在靜態庫中時,鏈接器會放棄(或者說從不鏈接)這些單元,因爲它們中沒有代碼被明確引用。明確提到編制單位中的符號會起反作用,直接抵觸該方法的主要目標之一。出於同樣的原因,/ INCLUDE不是一個可接受的選項,和/ OPT:NOREF實際上並沒有涉及到這個問題。
Metrowerks對它有一個__declspec指令,GCC有-force_load,但我找不到MSVC的任何等價物。
那麼,主要目的就是要避免必須在它所在的文件之外的任何地方引用全局對象。如果有幫助,這是一個單元測試框架;我討論的是從同一地點的多個庫中引用每個單元測試的想法,並且隨着單元測試數量的增長,它的縮放效果非常差。 不幸的是,__declspec(dllexport)不做任何事情,因爲這是一個靜態庫,而不是DLL。 – 2010-03-28 11:35:31
謝謝澄清。嗯。我認爲__declspec會在lib被包含到由OS加載的實際模塊(dll/exe)中時發揮作用,但顯然我錯了。 – Macke 2010-03-28 11:45:55