2011-12-27 45 views
1

我有一个核心项目,我正在将其构建为共享库。在集流管的一个中,我定义如下所示的简单类:在Android上导出共享库类的问题

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为核心,我已经在确定的CORE_DLL LOCAL_CFLAGS。然而,建立的时候,我得到警告:

warning: 'dllimporot' attribute directive ignored 

当NDK,构建得到的地方,我想用自锁类的其他项目中,我得到的错误:

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

为什么会产生编译器忽略dllexport属性?我希望一旦这个问题得到解决,我的另一个项目应该能够构建并且能够使用AutoLock类而不会有任何问题。

回答

0

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

当使用共享库,您应该只是-lYourLibraryName

编译这可以帮助你:http://www.adp-gmbh.ch/cpp/gcc/create_lib.html

+0

我已经尝试添加:-L $(LOCAL_PATH)/../../ libs/armeabi -lcore到我的Android.mk文件,但不幸的是我仍然得到'AutoLock :: AutoLock()'是私人错误。 – derek 2011-12-27 22:23:35

+0

我给你的解决方案与该错误无关。它只处理你在dllimport和dllexport上的错误。 AutoLock错误是非常明显的...如果你想构建一个对象,将AuthLock()构造函数移动到公共范围 – flumpb 2011-12-27 23:29:07

+0

这很有趣;我只是意识到错误消息引用了默认的构造函数,但是这不会在任何地方使用。我已经离开了那个私人的,并且故意未定义,因为我只想让AutoLock与一个Mutex一起使用。错误引用的行是:AutoLock(m_CommandMutex);所以我不确定它为什么抱怨默认是私人的。公开并定义它可以消除这个错误。 – derek 2011-12-28 00:18:28

0

已经在Android的NDK,特别是Android.mk可以看看示例代码文件这可能会解决你的问题。