我正在使用-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> >;
如果我通过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()
即,B<int>
可见,但B<A<int> >
不可见。如果我将标记为B<A<int> >
的代码段取消注释,则A<T>
会变为可见。但是,我不想将所有A都标记为可见,因为在实际代码中A<T>
包含大量应该保持私有的方法。
为什么A<T>
的展示率会影响B<A<T> >
的展示率?我可以在B<A<T> >
看不到所有A<T>
的情况下显示{{1}}吗?
答案 0 :(得分:1)
假设我正确理解ODR(我可能不会:)),隐藏您的B<A<int> >
即时化看起来像是与ODR相关的要求。如果未隐藏B<A<int> >
,则A<>
成员的多个即时消息可能存在并被引用,从而导致ODR违规。 GCC的symbol visibility Wiki简要描述了在“实体”上使用隐藏符号可见性与模糊链接(包括模板部分)时的此类违规行为(参见有关例外的部分)。
您想通过隐藏A<>
模板中的符号来实现什么目标?
答案 1 :(得分:0)
如果您特别希望隐藏A&lt;&gt;的内嵌方法。尝试使用 -fvisibility-内联隐藏