在his paper about shared libraries中,Ulrich Drepper建议在构建库时将符号可见性全局设置为隐藏,然后在源代码中设置为 default 对于每个要公开导出它的符号。但是,在搜索之后,我仍然不明白应该在何处指定可见性属性:声明或定义?由于任何不属于接口的符号都不会在公共标题中声明,我认为后面的选项更好,但this page from Microsoft让我怀疑:那里,相应的属性似乎已设置在标题中。
例如,在libwayland,一个Wayland协议的开源实现,它完成如下:
void wl_event_queue_destroy(struct wl_event_queue *);
WL_EXPORT void
wl_event_queue_destroy(struct wl_event_queue *)
{
/* ... */
}
我担心与其他编译器和平台的兼容性:GCC,Clang,MSVC,......还要注意这个问题也适用于C ++。
答案 0 :(得分:1)
对于GNU而言,这并不重要,但是在Windows标头声明中,无论如何都需要用dllimport
进行注释,因此通常也可以在其中放置可见性注释。
请注意,仅在编译库本身时才需要启用可见性注释,而在仅调用库函数的代码编译时则无需启用
#ifndef WL_EXPORT
# define WL_EXPORT
#endif
在标题中。