DSO 是动态共享对象,Linux报“hidden symbol ... is referenced by DSO”错误的原因是符号(函数)未导出导致的,添加导出申明即可解决:
__attribute__ ((visibility("default")))
其实这个和Windows下的dll导出是类似的,dll中需要申明导出才能被外部正常链接上,因此dll中使用如下代码即可兼容Win/Linux平台的函数导出:
#ifdef WIN32
#ifdef XXX_EXPORTS
#define XXX_API __declspace(dllexport)
#else
#define XXX_API __declspace(dllimport)
#endif
#define XXX_LOCAL
#else
#ifdef XXX_EXPORTS
#define XXX_API __attribute__ ((visibility("default")))
#else
#define XXX_API
#endif
#define XXX_LOCAL __attribute__ ((visibility("hidden")))
#endif
...
class XXX_API Object {
...
};
Linux与Windows导出不同的地方在于:1、Windows默认不导出,需要导出的话必须申明;Linux默认全部导出,但是很多时候默认的编译选项都加上了 -fvisibility=hidden 指定不导出,然后使用上面的宏,自定义导出,与Windows就类似了。