2016-12-05 85 views
1

我剛剛在讀「Creating Library with backward compatible ABI that uses Boost」。現在我有一個應該使用boost進行序列化的類。我怎樣才能從公共界面隱藏那部分?在提到的文章中,建議使用gcc的-fvisibility = hidden選項。我想在一個測試類來實現這一點:在共享庫的公共接口中隱藏boost :: serialization

#define LOCAL __attribute__ ((visibility ("hidden"))) 
#include <boost/serialization/nvp.hpp> 
#include <boost/serialization/serialization.hpp> 
#include <boost/shared_ptr.hpp> 

class hideBoost 
{ 
public: 
    int visible; 
    LOCAL boost::shared_ptr<int> notVisible; 

private: 
    friend class boost::serialization::access; 
    template<class archive> 
    void serialize(archive& ar, const unsigned int version) 
    { 
     ar & BOOST_SERIALIZATION_NVP(visible); 
     ar & BOOST_SERIALIZATION_NVP(notVisible); 
    } 
}; 

而我的主要程序是:

#include <iostream> 
#include "HideBoost.hpp" 
int main() 
{ 
    std::cout<<"start"<<std::endl; 
    hideBoost b; 
    b.visible=5; 
    b.notVisible=10; 
    std::cout<<"end"<<std::endl; 
} 

兩者都使用gcc-4.6 MacOSX上旗-fvisibility=hidden編譯。 編輯:主程序不必在編譯時增加標題,因此編譯失敗。我不想將boost頭文件傳遞給主程序,因爲這可能導致系統上安裝了多個版本的boost(我想這稱爲ABI不兼容)的系統不兼容。

現在我的問題:

1)在我的例子中,成員變量notVisible正確地從公共接口隱藏?

2)編輯:如何隱藏序列化例程和頭文件?

我很感謝任何提示如何做到這一點。在unix和OS X上使用gcc和clang工作的解決方案會很好。提前致謝!

最良好的祝願, 彼得

+0

正如HIF所說,能見度不是正確的工具。但是你最後想要達到什麼目標? 「我怎樣才能從公共接口隱藏那部分?」:什麼接口?頭文件? – YSC

+0

我更新了我原來的帖子。主要目標是避免安裝多個增強版本的系統出現問題。 – hansgans

回答

1

__attribute__ ((visibility ("hidden")))無關您的問題。您應該聲明notVisible私人該類別的成員。

__attribute__ ((visibility ("hidden")))只是告訴該屬性被把守的動態連接器,你不能一個符號鏈接到函數/變量。

請注意,你不能從nmobjdump -T列表中隱藏的象徵,不管它是"hidden""default""default"表示該屬性應用於的函數/變量應該爲從我們的庫中導出,而"hidden"則不是。