gpt4 book ai didi

c++ - 在共享库的公共(public)接口(interface)中隐藏 boost::serialisation

转载 作者:行者123 更新时间:2023-11-30 05:19:47 26 4
gpt4 key购买 nike

我刚刚在阅读“Creating Library with backward compatible ABI that uses Boost”。现在我有一个应该使用 boost 序列化的类。如何从公共(public)界面隐藏该部分?在提到的文章中,建议使用 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 上使用带有 -fvisibility=hidden 标志的 gcc-4.6 编译的。编辑:主程序不必在编译时 boost header ,因此编译失败。我不想将 boost header 传递给主程序,因为这会导致安装了多个版本的 boost 的系统不兼容(我猜这称为 ABI 不兼容)。

现在我的问题:

1) 我的示例中的成员变量 notVisible 是否正确隐藏在公共(public)接口(interface)之外?

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

对于如何正确完成此操作的任何提示,我深表感谢。在 unix 和 OS X 上使用 gcc 和 clang 的解决方案会很棒。提前致谢!

祝你好运,彼得

最佳答案

__attribute__ ((visibility ("hidden"))) 与您的问题无关。您应该将 notVisible 声明为该类的 private 成员。

__attribute__ ((visibility ("hidden"))) 只是告诉动态链接器您不能将符号链接(symbolic link)到此属性保护的函数/变量。

请注意,您无法从 nmobjdump -T 列表中隐藏符号,无论它是 "hidden" 还是 “默认”"default" 表示应用此属性的函数/变量应该从我们的库中导出,而"hidden" 不是't.

关于c++ - 在共享库的公共(public)接口(interface)中隐藏 boost::serialisation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40969547/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com