GCC (ARM) эквивалент declspec (dllexport)
при создании приложения для 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 ответов
в принципе, вы, вероятно, не нужно ничего особенного. Но если вы хотите (и если работаете над общими объектами, т. е. *.so
файлы), узнать больше о прагмы видимость и видимость атрибуты функция
и вопрос является более целевой операционной системой, чем целевой машиной. (Я бы предположил, что рука, работающая с какой-то неясной системой Windows8/ARM, также нуждается в вашем __declspec
; и наоборот,__declspec
не имеет смысла в Linux / x86).
вот упрощенная версия того, что мы используем в нашем коде.
#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"
часть.