簡體   English   中英

GCC(ARM)相當於__declspec(dllexport)

[英]GCC (ARM) equivalent to __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)使用什么?

編輯:

它用於很多類。 例如:

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;
};

基本上,你可能不需要任何特別的東西。 但如果您需要(如果您需要共享對象,即*.so文件),請了解有關可見性編譯指示和可見性函數屬性的更多信息

問題是目標操作系統比目標機器更具體。 (我認為運行一些不起眼的Windows8 / ARM系統的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 ,例如

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

由於您正在導出C ++方法,因此您可能希望跳過extern "C"部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM