GCC (ARM) эквивалентно __declspec (dllexport) - PullRequest
7 голосов
/ 24 ноября 2011

При сборке приложения для 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)?

Edit:

Используется во многих классах. например:

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 ]

6 голосов
/ 24 ноября 2011

В принципе, вам, вероятно, не нужно ничего особенного. Но если вы хотите (и если работаете с общими объектами, то есть *.so файлами), узнайте больше о прагмах видимости и видимости атрибутах функции

И вопрос в большей степени зависит от целевой операционной системы, чем от целевой машины. (Я полагаю, что ARM, работающему с какой-то непонятной системой Windows8 / ARM, также потребует вашу __declspec; и наоборот, ваша __declspec не имеет смысла в Linux / x86).

2 голосов
/ 24 ноября 2011

Вот упрощенная версия того, что мы используем в нашем коде.

#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".

...