MinGW:使用__declspec(dllexport)或__attribute __((visibility(“default”)))?

时间:2014-03-09 17:09:09

标签: 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

或者喜欢这个?

#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

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

2 个答案:

答案 0 :(得分:2)

可见度与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

答案 1 :(得分:0)

是MinGW支持__declspec dllimport / dllexport(http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html)。如果它更容易支持多个编译器,您应该使用它。 通常,编译器特定的属性不可移植,您应该使用宏包装器(如您的示例中所示)。