Geo*_*ing 9 c++ gcc templates visibility symbols
我正在使用-fvisibility = hidden在gcc下编译以下代码:
template<class T> struct /*__attribute__ ((visibility("default")))*/ A {};
template<class T> struct B
{
B() __attribute__ ((visibility("default")));
};
template<class T> B<T>::B() {}
template class B<int>;
template class B<A<int> >;
Run Code Online (Sandbox Code Playgroud)
如果我通过nm |运行生成的目标文件 grep B,我明白了
000000000002b97c t B<A<int> >::B()
000000000002b972 t B<A<int> >::B()
000000000002b968 T B<int>::B()
000000000002b95e T B<int>::B()
Run Code Online (Sandbox Code Playgroud)
即,B<int>可见但是B<A<int> >看不见. B<A<int> >如果我将片段标记取消注释为可见,则变为A<T>可见.但是,我不想将所有A标记为可见,因为在实际代码中A<T>包含大量应该保持私有的方法.
为什么能见度A<T>会影响能见度B<A<T> >?B<A<T> >如果没有全部A<T>可见,我可以看到吗?
假设我正确理解 ODR(我可能没有:)),隐藏您的B<A<int> >实例化看起来像 ODR 相关要求。如果B<A<int> >未隐藏,则 的成员的多个实例可能A<>存在并被引用,从而导致 ODR 违规。GCC 的符号可见性 Wiki简要描述了在具有模糊链接的“实体”(包括模板)上使用隐藏符号可见性时的此类违规行为(请参阅有关例外的部分)。
您想通过隐藏模板中的符号来实现什么目的A<>?
| 归档时间: |
|
| 查看次数: |
1456 次 |
| 最近记录: |