【问题标题】:Problems exporting class for shared library on Android在 Android 上为共享库导出类时出现问题
【发布时间】:2011-12-27 21:47:19
【问题描述】:

我有一个核心项目,我正在构建一个共享库。在其中一个标题中,我定义了一个简单的类,如下所示:

typedef pthread_mutex_t Mutex;

class CORE_API AutoLock
{
public:
    AutoLock(Mutex& m);
    ~AutoLock();

private:
    AutoLock();
    AutoLock(const AutoLock&);
    AutoLock& operator=(const AutoLock&);

    Mutex m_Mutex;
};

其中 CORE_API 定义为:

#ifdef CORE_DLL
#define CORE_API    __attribute__ ((dllexport))
#else
#define CORE_API    __attribute__ ((dllimport))
#endif

在内核的 Android.mk 中,我在 LOCAL_CFLAGS 下定义了 CORE_DLL。但是,在构建时,我收到警告:

warning: 'dllimporot' attribute directive ignored

当 ndk-build 到达我想使用 AutoLock 类的另一个项目时,我收到错误:

error: 'AutoLock::AutoLock()' is private
error: within this context

为什么编译器会忽略 dllexport 属性?我希望一旦解决了这个问题,我的另一个项目应该能够构建并能够毫无问题地使用 AutoLock 类。

【问题讨论】:

    标签: android c++ c arm gnu


    【解决方案1】:

    在 Android (Linux) 上创建共享库的方式与在 Windows 上不同。 在 Windows 中,您有特殊的 dllimport 和 dllexport 指令,但在 Android (Linux) 上没有。

    当使用你的共享库时,你应该只用 -lYourLibraryName 编译

    这可能会对您有所帮助:http://www.adp-gmbh.ch/cpp/gcc/create_lib.html

    【讨论】:

    • 我尝试将:-L$(LOCAL_PATH)/../../libs/armeabi -lcore 添加到我的 Android.mk 文件中,但不幸的是我仍然得到 'AutoLock::AutoLock( )' 是私人错误。
    • 我给你的解决方案与那个错误无关。它只处理您在 dllimport 和 dllexport 上遇到的错误。 AutoLock 错误很容易解释......如果你想以这种方式构造一个对象,请将 AuthLock() 构造函数移动到公共范围
    • 这很有趣;我刚刚意识到错误消息引用了默认构造函数,但这并没有在任何地方使用。我故意留下了私有和未定义,因为我只希望 AutoLocks 与传递给它的 Mutex 一起使用。错误所指的行是: AutoLock(m_CommandMutex);所以我不确定为什么它抱怨默认是私有的。将其公开并定义它可以消除该错误。
    • 那么它在某处被使用:)
    【解决方案2】:

    查看 android-ndk 中提供的示例代码,特别是 Android.mk 文件,这可能会解决您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2023-01-04
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多