我剛剛在讀「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工作的解決方案會很好。提前致謝!
最良好的祝願, 彼得
正如HIF所說,能見度不是正確的工具。但是你最後想要達到什麼目標? 「我怎樣才能從公共接口隱藏那部分?」:什麼接口?頭文件? – YSC
我更新了我原來的帖子。主要目標是避免安裝多個增強版本的系統出現問題。 – hansgans