天天看点

c++ __attribute__关键字

__attribute__((visibility("default")))

这个关键字与gcc编译参数

-fvisibility=hidden

配合使用,如果使用了hidden参数,那么该.so库所有符号只对内可见,对外不可见,即使链接了这个.so库,还是不能调用其中的符合(函数等);

对于大型工程,为了避免同名符号冲突(默认情况下,先链接的.so库符号会被可执行程序先链接,即如果有两个fun函数,分别在a.so 和 b.so,先链接a,则使用a的fun函数),可以先使用

-fvisibility=hidden

将所有符号隐藏,然后在需要对外的符号前添加

__attribute__((visibility("default")))

属性来保证符号对外可见。

当然也可以反过来,将

-fvisibility

设置为"default"或不设置这个属性,默认所有符号都对外可见,然后在不对外可见的函数或变量前添加

__attribute__((visibility("hidden")))

来隐藏该符号。