2013-05-07 67 views
4

我有一堆文件,它們被編譯到鏈接到各種項目的庫中,但大多數項目只需要相對較小的一部分。所以我需要將它拆分成圖層。檢查靜態庫是否定義了所有符號

爲了做到這一點,我想檢查下層不依賴於更高層的任何東西。在Linux上,我只是簡單地將這些庫共享並將-Wl,--no-undefined傳遞給鏈接。但我需要在Windows上執行此操作,因爲動態庫需要顯式導出,並且源代碼沒有爲此準備好。

我也可以爲每個圖層準備一個單元測試,並在鏈接期間彈出未定義的符號。然而,我只對小部分類進行單元測試,即使添加它們,如果添加了某些東西但未測試它們,它們仍然無法捕獲。

那麼有沒有其他方法來檢查靜態庫不需要任何符號,除了從指定的其他庫的集合?我可以使用Visual C++ 9.0(2008)或MinGW。

+0

-no-undefined是link.exe的默認值,它很不清楚爲什麼你需要以不同的方式做到這一點。您不需要在源代碼中顯式導出,只需要.def文件中的列表就足夠了。 – 2013-05-07 14:11:56

+0

@HansPassant:靜態庫不是用'link.exe'構建的,我相信我提到了爲什麼我不能讓它們在Windows上共享(dll)。 – 2013-05-08 20:00:53

回答

1

嗯,我可以與你分享一些特定於視覺工作室的強制鏈接。它並不是完全掃描以確保所有符號都已鏈接,但當強制註冊全局鏈接時(這實際上並未在代碼中的任何位置引用)時,這對我自己很有用。被放置在一個標題:

#define DECLARE_OBJ(TYPE, INSTANCE_NAME) \ 
    extern "C" TYPE INSTANCE_NAME; \ 
    __pragma(comment (linker, "/INCLUDE:_" __STRINGIZE(INSTANCE_NAME))) 

這確實警告的問題,關於兩個編譯時字符串之間的空間。因爲它是完全無用的,所以我把這個警告推到了外面。希望這可以幫助。

+0

我相信要避免出現可以編寫'__STRINGIZE(/ INCLUDE:_ ## INSTANCE_NAME)'的警告。我最近剛剛爲gcc做過類似的事情,它根本不接受編譯指示中的單獨字符串。 – 2013-05-22 14:10:31

相關問題