MinGW:使用 __declspec(dllexport) 还是 __attribute__((visibility("default")))?

pan*_*nzi 6 c dll mingw shared-libraries

MinGW 支持__declspec(dllexport)/吗__declspec(dllimport)?即使是这样,我应该使用吗__attribute__((visibility("default")))?基本上我应该根据平台或编译器来决定使用什么?

应该是这样吗?

#ifdef _MSC_VER
#   ifdef MYLIB_EXPORTS
#       define MYLIB_API __declspec(dllexport)
#   else
#       define MYLIB_API __declspec(dllimport)
#   endif
#else
#   define MYLIB_API __attribute__((visibility("default")))
#endif
Run Code Online (Sandbox Code Playgroud)

或者像这样?

#if defined(_WIN32) || defined(_WIN64)
#   ifdef MYLIB_EXPORTS
#       define MYLIB_API __declspec(dllexport)
#   else
#       define MYLIB_API __declspec(dllimport)
#   endif
#else
#   define MYLIB_API __attribute__((visibility("default")))
#endif
Run Code Online (Sandbox Code Playgroud)

那么像__declspec(align(16))Vs这样的事情呢?__attribute__((aligned(16)))

pan*_*nzi 4

可见性对比 dllexport 是一个平台的东西,而不是编译器的东西。因此,将__declspec(dllexport)/ __declspec(dllimport)(或__attribute__((dllexport))/ __attribute__((dllimport)))与 MinGW 一起使用是正确的方法。请参阅: http: //gcc.gnu.org/wiki/Visibility#How_to_use_the_new_C.2B-.2B-_visibility_support