首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当可见性生效时,如何导出公共的内部/嵌套类?

当可见性生效时,如何导出公共的内部/嵌套类?
EN

Stack Overflow用户
提问于 2015-03-09 22:26:48
回答 1查看 1.6K关注 0票数 4

我正在整理一个补丁,它增加了Crypto++库的可见度。根据GCC能见度的wiki:

在抛出异常的二进制文件中捕获用户定义类型的异常需要进行类型信息查找.然而,这并不是完整的故事--它变得更难了。默认情况下,符号可见性是“默认的”,但是如果链接器遇到一个隐藏的定义--只有一个--类型信息符号将永久隐藏(请记住C++标准的ODR -一个定义规则)。

拿走:所有东西(包括基类)都需要导出或使用__attribute__ ((visibility ("default")))进行修饰。所以我得到了一个异常类引用的例外列表,而且.

代码语言:javascript
运行
复制
class CRYPTOPP_DLL AlgorithmParametersBase
{
public:
    class ParameterNotUsed : public Exception
    {
    public: 
            ...
        }
}

然后:

代码语言:javascript
运行
复制
cryptopp$ nm -D libcryptopp.so | c++filt | grep ParametersNotUsed
cryptopp$

如果我用class CRYPTOPP_DLL ParameterNotUsed : public Exception进行重建,那么我得到的结果是相同的:

代码语言:javascript
运行
复制
class CRYPTOPP_DLL AlgorithmParametersBase
{
public:
    class CRYPTOPP_DLL ParameterNotUsed : public Exception
    {
    public: 
            ...
        }
}

现在,我相当肯定基类是导出的:

代码语言:javascript
运行
复制
$ nm -D libcryptopp.so | c++filt | grep Exception
00000000004d6980 V typeinfo for CryptoPP::Exception
0000000000230700 V typeinfo name for CryptoPP::Exception
00000000004d6bf0 V vtable for CryptoPP::Exception

我的问题:

  • 如何导出内部类或嵌套类,因为它似乎没有导出?
  • nm -D是验证typeinfo信息的正确工具吗?
  • 我是否能够捕获ParameterNotUsed异常(我怀疑不会)?
  • 我是否能够捕获Exception基类异常(我怀疑是这样)?

如果重要的话:

代码语言:javascript
运行
复制
$ gcc --version
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
EN

回答 1

Stack Overflow用户

发布于 2015-03-09 23:34:31

您是否尝试过像这样导出内部类:

代码语言:javascript
运行
复制
class Exception {};

class __declspec(dllexport) AlgorithmParametersBase
{
public:
    class ParameterNotUsed : public Exception
    {
    public:
    };
};

// exporting known type
class __declspec(dllexport) AlgorithmParametersBase::ParameterNotUsed;

不过,我没有测试上面的调用,但是它编译得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28952886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档