【问题标题】:MinGW: Use __declspec(dllexport) or __attribute__((visibility("default")))?MinGW:使用 __declspec(dllexport) 或 __attribute__((visibility("default")))?
【发布时间】:2014-03-09 17:09:08
【问题描述】:

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)) 之类的东西呢? __attribute__((aligned(16)))?

【问题讨论】:

    标签: c dll mingw shared-libraries


    【解决方案1】:

    可见性对比。 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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 所以我应该使用第二个例子?
      猜你喜欢
      • 2014-02-15
      • 2019-03-14
      • 1970-01-01
      • 2018-08-05
      • 2016-03-25
      • 2023-01-26
      • 2015-02-24
      • 1970-01-01
      • 2016-02-13
      相关资源
      最近更新 更多