在为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;
};
答案 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"
部分。