2011-03-21 65 views
9

我編譯下與-fvisibility GCC下面的代碼模板參數=隱藏:問題與C++隱藏的知名度

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> >; 

如果我通過納米運行生成的目標文件| 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> >是看不見的。如果我取消將標記A<T>標記爲可見,則可以看到B<A<int> >。但是,我不想標記A的全部可見,因爲在實際代碼中A<T>包含大量應該保持私有的方法。

爲什麼的A<T>能見度影響B<A<T> >知名度?我可以在不使A<T>全部可見的情況下看到B<A<T> >嗎?

回答

1

假設我正確的(我很可能不:))瞭解ODR,隱藏你的B<A<int> > instantatiation看起來像一個ODR相關要求。如果B<A<int> >未被隱藏,則A<>的多個成員可能存在並被引用,從而導致違反ODR。 GCC的symbol visibility Wiki簡要描述了在具有模糊鏈接的「實體」(包括模板)上使用隱藏符號可見性時的違規行爲(請參閱關於例外的部分)。

什麼是你想在您的A<>模板隱藏符號來實現?

+0

在我的代碼A <>是一個大量的聯方法向量類,和我d喜歡避免爲了文件大小和加載時間而將它們全部導出。 – 2011-03-24 16:38:29

0

如果你特別想隱藏<的聯方法>嘗試使用 -fvisibility - 內聯隱藏

+0

我正在使用-fvisibility = hidden,所以-fvisibility-inlines-hidden是多餘的。 – 2011-03-28 15:39:32

+0

似乎是這樣,但GCC指南建議添加它:'在你的構建系統(Makefile等)中,你可能希望在每個GCC的命令行參數中添加-fvisibility = hidden和-fvisibility-inlines-hidden選項調用「http://gcc.gnu.org/wiki/Visibility – volpato 2014-02-14 12:17:41