__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")))
来隐藏该符号。