GCC(ARM)相当于__declspec(dllexport)

时间:2011-11-24 14:04:59

标签: c++ gcc arm dllexport visual-studio-2010

在为x86构建应用程序时,以下代码可以正常工作:

#if   defined _WIN32
#define LIB_PRE __declspec(dllexport)
#elif defined __unix__
#define LIB_PRE
#else
#define LIB_PRE __declspec(dllexport)
#endif

但是给GCC(ARM)一个错误。我发现__declspec(dllexport)不适用于GCC。如果是这样,我应该为GCC(ARM)使用什么?

编辑:

它用于很多类。 e.g:

class CJsonValueString : public CJsonValue
{
 private:
  jstring value;
 public:
  LIB_PRE CJsonValueString(jstring value);
  LIB_PRE CJsonValueString(const CJsonValueString * value);
  LIB_PRE jstring ToString() const;
  LIB_PRE int ToInt() const;
  LIB_PRE int64 ToInt64 () const;
  LIB_PRE float ToFloat () const;
  LIB_PRE void GetValue(jstring & str) const;
};

2 个答案:

答案 0 :(得分:6)

基本上,你可能不需要任何特别的东西。但如果您需要(如果您需要处理共享对象,即*.so个文件),请详细了解visibility pragmas和可见性function attributes

问题是目标操作系统特定于目标机器特定。 (我认为运行一些不起眼的Windows8 / ARM系统的ARM也需要你的__declspec;相反,你的__declspec在Linux / x86上没有任何意义。

答案 1 :(得分:2)

这是我们在代码中使用的简化版本。

#ifdef __cplusplus
#define EXTERNC         extern "C"
#else
#define EXTERNC
#endif

#if defined(__NT__)                   // MS Windows
  #define idaapi            __stdcall
  #define ida_export        idaapi
  #if defined(__IDP__)                  // modules
    #define idaman          EXTERNC
  #else                                 // kernel
    #if defined(__X64__) || defined(__NOEXPORT__)
      #define idaman          EXTERNC
    #else
      #define idaman          EXTERNC __declspec(dllexport)
    #endif
  #endif
  #define ida_local
#elif defined(__UNIX__)                 // for unix
  #define idaapi
  #if defined(__MAC__)
    #define idaman          EXTERNC __attribute__((visibility("default")))
    #define ida_local       __attribute__((visibility("hidden")))
  #else  // Linux
    #if __GNUC__ >= 4
      #define idaman          EXTERNC __attribute__ ((visibility("default")))
      #define ida_local       __attribute__((visibility("hidden")))
    #else
      #define idaman          EXTERNC
      #define ida_local
    #endif
  #endif
#endif

在Linux / OS X上,我们默认使用-fvisibility=hidden -fvisibility-inlines-hidden编译所有代码并标记我们要用idaman导出的内容,例如

idaman bool ida_export set_enum_width(enum_t id, int width);

由于您正在导出C ++方法,因此您可能希望跳过extern "C"部分。