2012-10-23 153 views
3

我建立.lib靜態庫)一個大的項目,我想隱藏一些功能以結束庫的用戶,但我需要這些功能是從每一個.c調用庫內的文件(因此不是靜態的)。隱藏功能

這與__declspec(dllexport)完全相反,我已經找到了gcc的解決方案。

我想使用static,但是靜態函數should be僅在「當前.c文件」中可用,所以這不是方法。

換句話說:我需要一種方法,我怎麼能告訴微軟的Visual C++ 2010沒有的一些功能導出到最終.lib(同時保持它們可用於項目內的所有其他.c文件)。

注:我從來沒有在我的整個解決方案中使用__declspec(既不__attribute__(visibility)),這可能只是建立靜態庫(我不能跟蹤)相關的一些默認設置。

回答

4

這是不可能的。你所要求的與__declspec(dllexport)無關,這是一個屬性,它決定了什麼標識符在DLL之外是可見的。這當然會符合你的要求。

但你要求一個靜態庫。這是一個非常簡單的文件格式,它只是一包.obj文件。編譯後通過lib.exe放到一個檔案中。完全沒有辦法解決.lib中單獨編譯的.c文件之間的依賴關係。直到.lib鏈接後纔會發生這種情況。

在哪一點上,客戶端代碼使用的外部鏈接標識符與您的標識符之間沒有任何區別。試圖隱藏你的,如果可能的話,當鏈接器無法弄清楚如何滿足你的.c文件與其他文件的外部依賴關係時,就會造成鏈接失敗。

要取得任何接近的唯一方法是將代碼的所有都放在一個帶有標記爲靜態的功能的翻譯單元中,以便它們沒有外部鏈接。這是非常醜陋的,但可以通過包含所有其他.c文件的單個文件來完成。當然,你會忽略這個選項,所以要追求一個DLL解決方案來獲得這個。

0

我認爲從靜態庫中隱藏內部符號,只能將一些符號導出到外部用戶是可能的,至少在Linux平臺上是可能的。

我曾經在OSX和Linux有類似要求的工作,我的做法是嘗試創建「ld」有下列選項命令預鏈接庫:

-r -x -exported_symbols_list .. /exported_symbols.txt -o $ @ $ ^在makefiles中。用於xcrun LD


選項如下

-x 

    Delete all local symbols. 

-r 

    Generate relocatable output--i.e., generate an output file that can in turn serve as input to ld. This is often called partial linking 

-exported_symbols_list 

    option uses a text file exported_symbols.txt which contains all the interface APIs for the static library that you want to ship out. 

我認爲有可能是在Windows平臺上等同法。