在 Linux 中显式导出共享库函数

对于从共享库显式导出函数,是否存在与 __declspec(dllexport)符号等价的 Linux 表示法?由于我使用的工具链的某些原因,非类成员的函数不会出现在结果共享库文件中。

76110 次浏览
__attribute__((visibility("default")))

据我所知,没有相当于 __declspec(dllimport)的东西。

#if defined(_MSC_VER)
//  Microsoft
#define EXPORT __declspec(dllexport)
#define IMPORT __declspec(dllimport)
#elif defined(__GNUC__)
//  GCC
#define EXPORT __attribute__((visibility("default")))
#define IMPORT
#else
//  do nothing and hope for the best?
#define EXPORT
#define IMPORT
#pragma warning Unknown dynamic link import/export semantics.
#endif

典型的用法是定义一个像 MY_LIB_PUBLIC这样的符号,有条件地将其定义为 EXPORTIMPORT,基于库当前是否正在编译:

#if MY_LIB_COMPILING
#   define MY_LIB_PUBLIC EXPORT
#else
#   define MY_LIB_PUBLIC IMPORT
#endif

要使用它,您可以像下面这样标记函数和类:

MY_LIB_PUBLIC void foo();


class MY_LIB_PUBLIC some_type
{
// ...
};