簡體   English   中英

為什么NDK在Build上拋出Undefined Reference錯誤?

[英]Why is NDK throwing Undefined Reference error on Build?

我在嘗試使用ndk構建庫時遇到此錯誤:

$ /cygdrive/d/android-ndk-r10d/ndk-build.cmd [armeabi] SharedLibrary:libgame.so

jni / core / src / coreApplication.cpp:9:錯誤:未定義引用'CCoreMessaging :: CCoreMessaging()'

jni / core / src / coreApplication.cpp:11:錯誤:未定義引用'CCoreScreenContainer :: CCoreScreenContainer()'

jni / core / src / coreReference.h:75:錯誤:未定義引用'CCoreRefClass :: _ RemoveRef(void *,bool)'

jni / core / src / coreReference.h:76:錯誤:未定義引用'CCoreRefClass :: _ AddRef(void *,bool)'

jni / core / src / coreReference.h:58:錯誤:未定義引用'CCoreRefClass :: _ RemoveRef(void *,bool)'

jni / core / src / coreReference.h:58:錯誤:未定義引用'CCoreRefClass :: _ RemoveRef(void *,bool)'

jni / core / src / coreApplication.h:12:錯誤:未定義引用'CCoreMessaging :: ~CCoreMessaging()'

jni / core / src / coreReference.h:58:錯誤:未定義對CCoreRefClass的引用:: _ RemoveRef(void *,bool)'

collect2.exe:錯誤:ld返回1退出狀態

make.exe:*** [obj / local / armeabi / libgame.so]錯誤1

coreApplication.h:

<other includes>
#include "coreResources.h"
#include "coreMessaging.h"

class CCoreApplication
{
public:
CCoreApplication(CCoreContext& a_context);
virtual ~CCoreApplication() {} 

CCoreScreenContainer& GetScreenContainer() { return *m_screenContainer; }
CCoreMessaging& GetMessages() { return m_messages; }

<other functions and properties>
CCoreMessaging m_messages;
};

coreApplication.cpp

#include "coreApplication.h"
#include "coreMessaging.h"
#include "coreScreenContainer.h"
<other includes>

CCoreApplication::CCoreApplication(CCoreContext& a_context):
 m_context(a_context)
{
m_screenContainer = new CCoreScreenContainer;
GetScreenContainer().SetBounds(CRectangle(0,0, a_context.GetPlatformHandler()->GetResolutionWidth(), a_context.GetPlatformHandler()->GetResolutionHeight()));
}

coreMessaging.h:

class CCoreMessaging
{
public:
CCoreMessaging(); 
~CCoreMessaging();
void SendMessage(int a_messageID, void* argument0=0, void* argument1=0);
void AddMessageHandler(CCoreMessageHandle& handle, CCoreMessageDelegate handler);
void RemoveMessageHandler(CCoreMessageHandle& handle);
protected:
typedef std::map<int, CCoreMessageDelegate> Map;
Map m_Delegates;
int m_AutoIncrement;
int m_SelfID;
static int m_SelfIDIncrement;
};

coreMessaging.cpp

#include "coreMessaging.h"
<other functions>

CCoreMessaging::CCoreMessaging() : m_AutoIncrement(1)
{
m_SelfID = m_SelfIDIncrement++;
gMessaging[m_SelfID] = this;
if(m_SelfID > 127)
    throw std::runtime_error("too many messaging instances");
}

coreReference.h

class MFAPI CCoreRefClass
{
public:
virtual void Delete() { delete this; }

void _AddRef(void* cls, bool strong);
void _RemoveRef(void* cls, bool strong);

void _IncRef();
bool _DecRef(); // returns true if reference decrease has lead to destruction. false if object is still valid
protected:
CCoreRefClass();
virtual ~CCoreRefClass();

typedef CCoreRefPtr<CCoreRefClass,false> RefType;
std::vector<RefType*> m_refData;

int m_refCount;
};

coreReference.cpp

#include "coreReference.h"

<other functions>
void CCoreRefClass::_RemoveRef( void* cls, bool strong )
{
RefType* refCls = (RefType*)cls;
int lastIdx=(int)m_refData.size()-1;
int refIdx = refCls->m_arrayIndex;
refCls->m_arrayIndex = -1;

// swap erase reference
m_refData[refIdx] = m_refData[lastIdx];
m_refData[refIdx]->m_arrayIndex = refIdx;
m_refData.pop_back();

if(strong)
    _DecRef();
}

void CCoreRefClass::_AddRef( void* cls, bool strong )
{
if(strong)
    _IncRef();

RefType* refCls = (RefType*)cls;
m_refData.push_back(refCls);
refCls->m_arrayIndex = (int)m_refData.size()-1;
}

大多數這些錯誤似乎都是由拼寫錯誤產生的,但是這段代碼確實在visual studio中完全編譯為lib。 我希望這只是我錯過或沒見過的東西。 如果需要,請隨時提出更多要求。

編輯:application.mk

APP_STL := gnustl_static
APP_CPPFLAGS += -std=c++11
NDK_TOOLCHAIN_VERSION := 4.8
APP_PLATFORM := android-14

android.mk

LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)     
# Here we give our module name and source file(s)

LOCAL_MODULE    := game
LOCAL_SRC_FILES := coreBridge.cpp core/game.cpp core/src/coreApplication.cpp
LOCAL_LDLIBS :=  -llog -lGLESv2

include $(BUILD_SHARED_LIBRARY)
#include $(BUILD_EXECUTABLE)

感謝Bogdan V.我發現我需要包含所有源文件。 但不是將它們全部分開鏈接,而是一次全部鏈接:

Android.mk:

LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)

# Here we give our module name and source file(s)

LOCAL_MODULE    := libgame
LOCAL_SRC_FILES := coreBridge.cpp core/game.cpp

FILE_LIST := $(wildcard $(LOCAL_PATH)/../../../core/src/*.cpp)
LOCAL_SRC_FILES += $(FILE_LIST:$(LOCAL_PATH)/%=%) LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../../core/include

LOCAL_LDLIBS :=  -llog -lGLESv2
LOCAL_CPP_FEATURES += exceptions
LOCAL_SHARED_LIBRARIES := libgame.so

include $(BUILD_SHARED_LIBRARY)
#include $(BUILD_EXECUTABLE)

其中:

FILE_LIST := $(wildcard $(LOCAL_PATH)/../../../core/src/*.cpp)
LOCAL_SRC_FILES += $(FILE_LIST:$(LOCAL_PATH)/%=%) LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../../core/include

是他們所有人的重要組成部分。 這讓我可以創建.so。

您沒有在構建中添加定義這些符號的文件:

coreMessaging.cpp
coreReference.cpp

想必

coreScreen.cpp (that i don't see here).

包括標頭意味着只添加聲明。 您需要編譯源以獲取包含鏈接時用戶的實際符號的目標文件。

暫無
暫無

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

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