在共享库的公共接口中隐藏boost :: serialization

时间:2016-12-05 07:54:11

标签: c++ boost abi

我只是在阅读" Creating Library with backward compatible ABI that uses Boost"。现在我有一个应该使用boost序列化的类。如何从公共界面隐藏该部分?在提到的文章中,建议使用gcc的-fvisibility = hidden选项。我试图在测试类中实现它:

#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;
}

两者都是在MacOSX上使用gcc-4.6编译的,标志为-fvisibility=hidden。 编辑:主程序不必在编译时提升标头,因此编译失败。我不想将boost标头传递给主程序,因为这会导致安装了多个boost版本的系统不兼容(我猜这叫做ABI不兼容)。

现在我的问题:

1)我的示例中的成员变量notVisible是否正确地从公共接口隐藏了?

2)编辑:如何隐藏序列化例程和头文件?

我感谢任何有关如何正确完成此事的提示。在unix和OS X上使用gcc和clang工作的解决方案会很棒。提前致谢!

祝福, 彼得

0 个答案:

没有答案