我只是在阅读" 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工作的解决方案会很棒。提前致谢!
祝福, 彼得